[BOJ 1181][백준 1181번] 단어 정렬 (파이썬 풀이)
도깨비젤리
·2021. 6. 2. 01:30
https://www.acmicpc.net/problem/1181
🤔 문제 설명 및 입출력
✍ 접근 방법
앞서 풀었던 10814번과 완전 동일한 유형의 문제이다.
참고 : https://spookyjelly.tistory.com/15
1순위 : len(x) / 2순위 : x 로 두고 sort with lambda를 사용하여 정렬 후, 출력한다.
👨💻 소스 코드
- 파이썬
N = int(input())
words = []
for _ in range(N):
words.append(input())
words = list(set(words))
# 길이 순 정렬 / 2순위 : 사전 순 정렬
words = sorted(words,key= lambda x : [len(x),x])
for word in words:
print(word)
문자열 타입도 sort를 통해 정렬 시킬 수 있다. 그리고 그렇게 정렬시키면 파이썬이 자동으로 사전 순으로 정렬해준다.
놀라움! 😍😍😍
🔥 강평
이거 자바스크립트로 구현하라고 했으면 굉장히 머리 아팠을 것 같다...
파이썬 그는 신인가?
아직 lambda를 이용한 정렬이 익숙치 않은 분들을 위해 제가 공부할때 정리 해놓은 노트를 별첨합니다.
sort with Lambda
정확히 말하자면, .sort / sorted()는 정렬 조건으로 key를 받는다.
근데 그 key라는 것이 함수형을 받을 수 있기에, 즉석 함수인 Lambda도 받을 수 있는 것이다.
일반적인 소팅은 알다시피 아래와 같다.
a = [4,1,2,5,7,3,6]
b = sorted(a)
# b = [1,2,3,4,5,6,7]
아무런 key도 넣어주지 않은 경우, 순수한 오름차순 정렬이 된다.
하지만, key를 넣어주게 되면 정렬을 다양하게 활용할 수 있다.
lambda는 lambda 매개변수 : 표현식 꼴로 사용되는데, 매개변수의 자리에 lamda가 사용된 자료형의 값들이 들어가게 된다.
a = [(1, 2), (0, 1), (5, 1), (5, 2), (3, 0)]
# 인자없이 그냥 sorted()만 쓰면, 리스트 아이템의 각 요소 순서대로 정렬을 한다.
b = sorted(a)
# b = [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]
# key 인자에 함수를 넘겨주면 해당 함수의 반환값을 비교하여 순서대로 정렬한다.
# 이하는 x[0] 과 x[1]을 기준으로 오름차순 정렬한 모습이다.
c = sorted(a, key = lambda x : x[0])
# c = [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]
d = sorted(a, key = lambda x : x[1])
# d = [(3, 0), (0, 1), (5, 1), (1, 2), (5, 2)]
# 아이템 첫 번째 인자를 기준으로 오름차순으로 먼저 정렬하고,
# 그리고 그 안에서 다음 두 번째 인자를 기준으로 내림차순으로 정렬하게 하려면, 다음과 같이 할 수 있다.
e = [(1, 3), (0, 3), (1, 4), (1, 5), (0, 1), (2, 4)]
f = sorted(e, key = lambda x : (x[0], -x[1]))
# f = [(0, 3), (0, 1), (1, 5), (1, 4), (1, 3), (2, 4)]
정리하면,
- sorted()의 key 인자로, 내가 커스텀할 비교 함수를 보내주면 넣어주면 된다.
- 비교 함수는 비교할 아이템의 요소를 반환하면 된다.
- 비교 함수는 익명 함수(lambda) 도 가능하고, 별도로 정의해도 된다.
- 비교할 아이템의 요소가 복수 개일 경우,
- ex. sorted(e, key = lambda x : (x[0], -x[1]))
- - 를 붙이면, 현재 정렬차순과 반대로 하게 된다. ( 오름차순 ➡ 내림차순)
- 튜플로 그 순서를 내보내주면 된다.
한편, 다음을 살펴보자
log = ["dig1 8 1 4 5", "dig3 1 3 4 5", "dig2 2 203 1 0"]
dign을 식별자라고 할 때, 이 하의 숫자들을 기준으로 오름차순 정렬해보자.
log = sorted(log,key = lambda x : x.split()[1:])
x.split()[1:]이 제일 눈에 띄는데, 위에서 말했듯, x 인자 자리에는 lambda가 사용되는 자료형의 인자들이 들어가고, .sort / sorted 함수는 해당 key를 기준으로 정렬을 시행한다고 하였다.
따라서 log의 요소들을 공백 단위로 나눈 후, 그것의 1번째 요소부터 기준으로 하여 오름차순 정렬을 한다는 말이다.
표현이 조금 덜 다듬어 졌는데, 반복해서 사용하다보면 곧 익숙해질것이다.
- 만약 정렬 기준이 한가지 이상이라면?
- 아래와 같이 튜플 꼴로 묶어줘야한다!! (리스트 꼴로 묶어도 됩니다.)
- 에러 뜰 때는 위치 인자랑 키워드 인자 문제라고 말이 나오는데, 복수의 기준이 필요하다면 튜플로 묶어야한다고 알고 있자.( 다시 한번 말하지만, 리스트 꼴로 묶어도 됩니다)
letter.sort(key=lambda x: (x.split()[1:], x.split()[0]))
등장 순서 대로 우선순위가 적용된다.
여하튼, Lambda는 sort, filter와 쓸때 가장 파워풀 해지니까, 익숙하게 사용하도록 하자.
'Algorithm > Baekjoon' 카테고리의 다른 글
[BOJ 2156][백준 2156번] 포도주 시식 (파이썬 풀이) (0) | 2021.06.11 |
---|---|
[BOJ 16236][백준 16236번] 아기상어 (파이썬 풀이) (0) | 2021.06.05 |
[BOJ 10814][백준 10814번] 나이순 정렬 (파이썬 풀이) (0) | 2021.06.02 |
[BOJ 1865][백준 1865번] 웜홀 (파이썬 풀이) (0) | 2021.06.02 |
[BOJ 1149][백준 1149번] RGB거리 (파이썬 풀이) (0) | 2021.06.01 |