2024. 12. 10. 22:36ㆍAlgorithms/백준알고리즘 연습
어제 못푼거
2751번 수 정렬하기 2
메모리/시간이 중요한 문제였음
수정렬하기 3번이랑 다른 점
이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다.
참고 3번 정답
import sys
n = int(sys.stdin.readline())
count = [0] * 10001 # 0부터 10000까지의 숫자를 카운트할 리스트
for _ in range(n):
num = int(sys.stdin.readline())
count[num] += 1
for i in range(10001):
if count[i] > 0:
for _ in range(count[i]):
print(i)
2번 초기 코드
n = int(input())
for _ in range(n):
nums = [map(int, input().split())]
sort(nums)
for i in nums:
print(i)
시간초과가 발생하였는데 이유는 아래와 같음
1. 문제에서 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
그러면 일단 nums를만드는데 있어 루프가 너무 많이 돌아감.
2번정답코드
import sys
n = int(sys.stdin.readline())
nums = set() # 중복을 피하기 위해 set 사용
for _ in range(n):
num = int(sys.stdin.readline())
nums.add(num)
for num in sorted(nums): # 정렬된 순서로 출력
print(num)
계수정렬 알고리즘을 이용하여 이렇게 풀 수도 있음
import sys
n = int(sys.stdin.readline())
nums = [0] * 2000001 # 음수를 포함한 범위, 나는 abs(100001)을 했는데먹히지 않았음
for _ in range(n):
num = int(sys.stdin.readline())
nums[num + 1000000] = 1
for i in range(2000001):
if nums[i]:
print(i - 1000000)
계수정렬 알고리즘을 쓰면 메모리, 시간 모두 줄어드는 것을 알 수 있음
계수 정렬
데이터의 크기 범위가 작을때, 사용할 수 있는 매우 빠른 정렬 알고리즘이다.
일반적으로 데이터 크기 범위가 1,000,000(백만)을 넘지 않을때만 사용할 수 있음
[ 계수 정렬의 시간복잡도 ]
데이터의 갯수를 M, 데이터의 최대값 크기를 K라고 할때, 계수 정렬의 시간복잡도는 O(N+K)로 이제까지 살펴본 정렬 알고리즘 중 가장 빠르다. 하지만 데이터의 최대값 크기만큼의 메모리가 필요하기 때문에 심각한 비효율성을 초래할 수 있다. 예를 들어 10,000,000와 1로 단 2개의 데이터를 가지고 있을때도 10,000,001크기의 리스트를 선언해야한다. 때문에 계수 정렬은 데이터의 크기 범위가 작을때만 사용하는 것이 좋다.
출처 : https://doing7.tistory.com/73
이틀 째 이해중인데 다른 정열은 이해가는데 얘는 도통 인덱스를 마지막에 불러온다는 말을 이해 못하겠다. 다른 강의도 들어봐야지..
1427번
소트인사이드
받은 수를 문자행으로 바꾸고, reverse 나열해서 다시 합치면 됨
import sys
n = int(sys.stdin.readline())
def solution(n):
n= str(n)
n_sort= sorted(n,reverse=True)
return int("".join(n_sort))
c = solution(n)
print(c)
함수를 정의하는게 아직 초보임
n = int(input() 이렇게 받아오면
인풋받아오는 것만 해도 4ms 가 더 걸림
11650번 좌표 정렬하기
문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
예제 입력 1 복사
5
3 4
1 1
1 -1
2 2
3 3
예제 출력 1 복사
1 -1
1 1
2 2
3 3
3 4
초기 만든 코드
import sys
n = int(sys.stdin.readline())
cor = []
for _ in range(n):
cor.append(input().split())
def solution(data):
return int(data[0])
result = sorted(cor, key=solution)
#x좌표로 순서대로나열
for i in range(map(int,result)):
if sum(result(i)) > sum(result(i+1)) :
result[i], result[i+1] = result[i+1], result[i]
for r in result:
print(r, end=' ')
틀렸다. 타입에러가 난다
x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램 이 부분이 조금 어려운 것 같다.
정답 코드(by perplexity ai )
import sys
n = int(sys.stdin.readline())
cor = []
for _ in range(n):
x, y = map(int, sys.stdin.readline().split())
cor.append((x, y))
cor.sort(key=lambda p: (p[0], p[1]))
for x, y in cor:
print(x, y)
x,y 를 받고 리스트 형태로 저장한다.
리스트 안에 또 리스트를 넣어 저장할 수 있다는 사실을 2년전에 배운거같은데 진짜 하나도 기억을 못하는 것 같다.
cor.sort(key=lambda p: (p[0], p[1]))
lambda 함수를 써서 key가 p[0]참고하고, 나중에 p[1]를 써서 나열하도록
- 여기에서 p는 임시 변수이다. 아무 알파벳이나 써도 됨
그리고 x,y를 프린트하도록 함
11651번 좌표정렬하기 2
문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
예제 입력 1 복사
5
0 4
1 2
1 -1
2 2
3 3
예제 출력 1 복사
1 -1
1 2
2 2
3 3
0 4
이건 cor.sort(key=lambda p: (p[0], p[1])) 얘 순서만 바꿔주면 됨
1181번 단어 정렬
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
예제 입력 1 복사
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
예제 출력 1 복사
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate
초기 코드
import sys
n = int(sys.stdin.readline())
cor = []
for _ in range(n):
x = str(sys.stdin.readline())
cor.append(x)
cor = set(cor) #중복제거
cor.sort(key=len) #글자크기로나열
cor_sorted = sorted(cor) #알파벳크기로나열
for i in cor:
print(i)
답안 코드 (직접 써보기)
import sys
n = int(sys.stdin.readline())
cor = set()
for _ in range(n):
x = sys.stdin.readline().strip()
cor.add(x)
sorted_cor = sorted(cor, key= lambda x: (len(x),x))
for i in range(len(sorted_cor)):
print(i)
10814 나이순 정렬
첫번째 숫자 순서대로 나열하고, 두번째 값의 원래 인덱스 순서대로 나열해야 한다
import sys
a_list = []
n = int(sys.stdin.readline())
for _ in range(n):
x = sys.stdin.readline().split()
a_list.append(x)
sorted_a_list = sorted(a_list, key= lambda x: (int(a_list[0]),a_list[1]))
for i in sorted_a_list:
print(i)
틀림
import sys
a_list = []
n = int(sys.stdin.readline())
for _ in range(n):
age, name = sys.stdin.readline().split()
a_list.append((int(age), name))
sorted_a_list = sorted(a_list, key=lambda x: x[0]) # 나이만으로 정렬
for age, name in sorted_a_list:
print(f"{age} {name}")
두가지 요소의 성질이 다르면, 그냥 인수 자체를 두가지로 넣어주면 됨
'Algorithms > 백준알고리즘 연습' 카테고리의 다른 글
약수, 배수와 소수 2 (2) | 2024.12.14 |
---|---|
백준 집합과 맵 (0) | 2024.12.11 |
백준 부루트 포스 (복습 필요) (2) | 2024.12.09 |
백준 시간복잡도 (0) | 2024.12.07 |
백준 기하 (0) | 2024.12.07 |