
단어의 정렬
https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
좌표의 정렬
https://www.acmicpc.net/problem/11650
11650번: 좌표 정렬하기
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
www.acmicpc.net
두 문제 모두 정렬문제로 sort 하는 key 값을 어떤 기준으로 할지에 대한 값을 정하는것이다.
이를 사용할때 sort의 key 값을 이용하여 정렬이 가능한데 key 값으로는 lambda 함수를 사용하거나 별도의 함수를 지정하여 사용할 수 있다.
1. lambda 를 이용하는 경우
my_list = [...] # 정렬하고자 하는 리스트
my_list.sort(key=lambda x: (첫번째 조건, 두번째조건, 세번째 조건))
2. 별도의 함수를 이용하는 경우
my_list = [...] # 정렬하고자 하는 리스트
def sort_key(x):
return (조건1, 조건2, 조건3) # tuple 의 형태 등으로 반환해야한다.
my_list.sort(key=sort_key)
각 조건은 조건의 순서에 맞게 우선순위 적용된다고 보면 된다.
문제 1) 단어의 정렬의 경우는
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
따라서 중복 제거를 위해 집합 함수를 이용하고, 다시 list 로 변환하여 정렬하였다. 이때 집합은 정렬가능한 자료형이 아니므로 list 로 반드시 변환해야한다.
import sys
t = int(input())
res = []
for _ in range(t):
res.append(sys.stdin.readline().rstrip())
res = set(res) # 중복제거
res = list(res)
res.sort(key=lambda x : (len(x), x)) # 길이기준, 알파벳 기준
for r in res:
print(r)
문제2)
2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
앞선 숫자 먼저 기준으로 삼고 같은 경우 뒤의 숫자를 기준으로 삼는다.
import sys
n = int(input())
res = []
for _ in range(n):
n,m = map(int, sys.stdin.readline().split())
res.append((n, m))
res.sort(key=lambda x: (x[0], x[1])) # x, y 좌표순서로 오름차순
for i in res:
print(*i)
하지만 만약 한 좌표는 오름 차순 하나는 내림차순을 기준으로 삼는다면 둘중 하나의 부호를 반대로 해주면 된다.
'코딩테스트' 카테고리의 다른 글
[BOJ 2167] 2차원 배열의 합 (0) | 2023.06.11 |
---|---|
[1차] 캐쉬(python) (0) | 2023.05.19 |
[BOJ 10448] 유레카 이론 (Python) (0) | 2023.05.09 |
댓글