https://www.acmicpc.net/problem/11650
이 문제의 경우 이중 리스트로 모두 저장한 후 정렬을 하면 된다.
기본적으로 sort 함수는 오름차순으로, 앞 순서부터 정렬을 하기 때문에 이 문제에서는 그냥 sort 정렬을 하면 된다.
n=int(input())
li=[]
for i in range(n):
[a, b] = map(int, input().split())
li.append([a, b])
li.sort()
for i in li:
print(i[0], i[1])
1. sort 함수 기준 정하기
위 문제는 그냥 sort 함수를 사용하면 됐지만 첫 번째 값이 아닌 두 번째 값을 기준으로 내림차순 정렬을 한다던가 이럴 때는 sort 함수의 기준을 바꿔주어야 한다.
sort 함수의 인자로 key = function을 넣어주면 되고 function이 곧 기준이 된다.
예를 들어 두 번째 값을 기준으로 오름차순으로 정렬을 하는데 두 번째 값이 같을 때에는 첫 번째 값을 기준으로 오름차순으로 하고싶다면
li.sort(key = lambda x: (x[1], x[0]))
위와 같이 우선순위를 변경하면 된다.
만약 두 번째 값을 기준으로 내림차순으로 정렬을 하는데 두 번째 값이 같을 때에는 첫 번째 값을 기준으로 오름차순으로 하고 싶다면
li.sort(key = lambda x: (-x[1], x[0]))
위와 같이 우선순위를 변경하면 된다.
아니면 오로지 두 번째 값을 기준으로만 오름차순 정렬을 하고 첫 번째 값은 그냥 입력받은 순서대로 두고 싶다면
li.sort(key=lambda x: x[1])
위와 같이 우선 순위를 두 번째 값으로 하나만 설정하면 된다.
2. sys 라이브러리를 사용하여 input 시간 줄이기
나는 그냥 input을 사용하여 문제를 해결했는데 시간이 오래 걸렸다.
이럴 때 sys 라이브러리를 사용하면 시간을 줄일 수 있다.
input()을 사용하는 것이 아닌 sys.stdin.readline()을 사용하면 된다.
내가 사용한 코드에서 input만 변경해보았다.
import sys
n=int(sys.stdin.readline())
li=[]
for i in range(n):
a, b = map(int, sys.stdin.readline().split())
li.append([a, b])
li.sort()
for i in li:
print(i[0], i[1])
<input()을 사용한 결과>
<sys.stdin.readline()을 사용한 결과>
11651
https://www.acmicpc.net/problem/11651
위에서 설명한 sort 함수의 기준대로 풀면 된다.
import sys
n=int(input())
li=[]
for i in range(n):
a, b = map(int,sys.stdin.readline().split())
li.append([a,b])
li.sort(key=lambda x: (x[1], x[0]))
for i in li:
print(i[0], i[1])
10814
https://www.acmicpc.net/problem/10814
위에서 설명한 sort 함수의 기준대로 풀면 된다.
import sys
n=int(input())
li=[]
for i in range(n):
a, b = sys.stdin.readline().split()
a=int(a)
li.append((a,b))
li.sort(key=lambda x:x[0])
for i in li:
print(i[0], i[1])
'백준 알고리즘 > 정렬' 카테고리의 다른 글
[백준 18870][파이썬] 좌표 압축 (파이썬 dictionary) (0) | 2023.01.31 |
---|---|
[백준 1427][파이썬] 소트인사이드 (문자열을 리스트로, 리스트를 문자열로 변환) (리스트에서 특정 문자 제거) (0) | 2023.01.27 |
댓글