백준 1181 번 : 단어 정렬
📖 문제 📖
https://www.acmicpc.net/problem/1181

📺 입력&출력 📺

📝 풀이 📝
1차적으로 길이가 짧은것 순으로 정렬하고
2차적으로 길이가 같다면 사전순으로 정렬해야 하기 때문에
sort()로 먼저 사전 순으로 정렬하고
sort()로 길이에 따라 정렬을 합니다.
여기서 중요한점은
sort()와 sort(key=len)의 순서가 바뀌면 다른 결과가 나온다는 것입니다.
이유는 따로 글으로 정리해봤습니다!
https://ggami99.tistory.com/32
요약하자면 파이썬의 정렬 알고리즘은 stable하기 때문에 정렬을 유지한다는 특징이 있다는 것입니다.
만약, sort(key=len)을 먼저 한다면
길이로 정렬된 배열이 이후 sort()에 의해 무시되고 sort()만 처리되어 나옵니다.
하지만 sort()를 먼저 한다면 우선 사전순으로 정렬하고,
sort(key=len)을 하면 사전순으로 정렬된것들을 유지하면서 길이대로 정렬합니다.
👨💻 나의 코드 👨💻
n = int(input())
arr = [str(input()) for i in range(n)]
setArr = list(set(arr))
setArr.sort()
setArr.sort(key=len)
for i in setArr:
print(i)
👩👩👧👧 다른 사람의 코드 👩👩👧👧
N = int(input())
arr = [input() for _ in range(N)] # 입력된 단어들을 리스트에 추가
set_arr = list(set(arr)) # 세트형으로 중복을 제거 후 리스트형으로 저장
sort_arr = []
for i in set_arr:
sort_arr.append([len(i), i]) # 단어 길이와 단어가 들어간 리스트를 생성
sort_arr.sort(key = lambda x : (x[0], x[1])) # 인덱스값 0 -> 1 순으로 정렬
for i in range(len(sort_arr)):
print(sort_arr[i][1]) # 정렬된 리스트의 인덱스 1번만 하나씩 출력
람다식으로 구현한 분들이 많았습니다!
저와는 다르게 람다식이 쓰기 편하다는 의견들이 많았습니다.
람다식을 써본적이 많이 없어 쓰는걸 주저했지만 이번 기회에 한번 마스터 해봐야겠다는 생각을 했습니다!
https://ggami99.tistory.com/33
N = int(input())
arr = [input() for _ in range(N)] # 입력된 단어들을 리스트에 추가
set_arr = list(set(arr)) # 세트형으로 중복을 제거 후 리스트형으로 저장
sort_arr = []
for i in set_arr:
sort_arr.append([len(i), i]) # 단어 길이와 단어가 들어간 리스트를 생성
sort_arr.sort(key = lambda x : (x[0], x[1])) # 인덱스값 0 -> 1 순으로 정렬
for i in range(len(sort_arr)):
print(sort_arr[i][1]) # 정렬된 리스트의 인덱스 1번만 하나씩 출력
이 코드는 다른 사람의 풀이 코드입니다.
하나하나 해석해보자면 바로위의 for문에서 sort_arr에 [길이, 단어] 형식으로 배열을 만들어주었습니다.
❓여기서 이해가 가지 않는 의문이 발생했습니다.❓
lambda로 x매개변수를 가지고 x[0] 과 x[1]을 return한다는 것은 이해했지만
반복문이 없는데 어떻게 sort_arr의 값들이 하나하나 람다식의 매개변수 x로 들어가는지 이해가 가지 않았습니다.
하지만 열심히 검색한 결과 sort 메소드에 비밀이 있다는것을 알 수 있었습니다.
'key'에 인자를 전달하면 sort 메소드는 리스트의 각 요소를 순회하면서, 각 요소에 'key'함수를 적용합니다.
이 과정이 sort()메소드 내부적으로 구현되어있기 때문에 이터러블 요소에 대해 연산을 수행 하는것 이였습니다.
map()도 비슷한 원리라고 보면 될거같습니다!
👨💻느낀점👨💻
문제를 풀때마다 모르는 개념이 나와서 답답하기도 하지만 깊숙히 알아보면서 하나하나 해결해 나가는 과정이
너무 재밌기도 합니다.
이번 시간엔 lambda에서 시작해서 sort()와 map()의 원리까지 깊숙히 알아봤습니다.
그동안 두려움을 가지고 있었던 lambda에서 해방된거같아 너무 자유롭습니다 :)
'🏅Coding Test' 카테고리의 다른 글
| [파이썬, Python] 백준 18870 : 좌표 압축 (1) | 2024.02.13 |
|---|---|
| [파이썬, Python] 백준 10814 : 나이순 정렬 (0) | 2024.02.13 |
| [파이썬, Python] 백준 11650 : 좌표 정렬하기 (1) | 2024.02.10 |
| [파이썬, Python] 백준 2839 : 설탕 배달 (0) | 2024.02.09 |
| [파이썬, Python] 백준 1436 : 영화감독 숌 (0) | 2024.02.09 |