본문 바로가기
코딩테스트

백준 실버5 : sort(key=)

by YTom 2023. 5. 23.

단어의 정렬

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개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

단, 중복된 단어는 하나만 남기고 제거해야 한다.

 

따라서 중복 제거를 위해 집합 함수를 이용하고, 다시 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

댓글