https://www.acmicpc.net/problem/1181
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.
- 가장 긴 단어의 길이(max_num)를 저장한다.
- max_num만큼 이중 리스트를 만든다.
(문제의 예제에서 가장 긴 단어의 길이가 8이므로 8+1=9개로 이루어진 이중 리스트를 만든다.)
- 단어 길이가 1이면 cnt[1]에 추가하고, 길이가 2이면 cnt[2]에 추가해서 같은 길이의 단어끼리 한 리스트에 추가될 수 있도록 한다.
이때, 리스트에 있는 단어인지 확인하고 중복을 제거한다.
- sort를 이용해서 같은 길이의 단어를 정렬해 출력한다.
num = int(input()) data = [] max_num = 0 #data list의 가장 긴 단어의 길이 for i in range(num): x=input() data.append(x) if max_num < len(x): #가장 긴 단어의 길이 저장 max_num = len(x) cnt=[[] for i in range(max_num+1)] #단어의 길이로 나눌 빈 리스트 생성 for i in data: #단어 길이가 같은 것끼리 분류 if i not in cnt[len(i)]: #중복 제거 cnt[len(i)].append(i) for i in range(1, max_num+1): cnt[i].sort() #정렬 시킨 후, 출력 for j in range(len(cnt[i])): print(cnt[i][j])
words_num = int(input()) words_list = [] for _ in range(words_num): word = str(input()) word_count = len(word) words_list.append((word, word_count)) #중복 삭제 words_list = list(set(words_list)) #단어 숫자 정렬 > 단어 알파벳 정렬 words_list.sort(key = lambda word: (word[1], word[0])) for word in words_list: print(word[0])
출처 : https://claude-u.tistory.com/148
*lambda 인자 : 표현식 https://wikidocs.net/64
✅ 위의 코드와 차이점
=>맨 처음 word_list를 (word_count,word)로 삽입하면 lambda없이 정렬 가능
words_num = int(input()) words_list = [] for _ in range(words_num): word = str(input()) word_count = len(word) words_list.append((word_count, word)) #중복 삭제 words_list = list(set(words_list)) #단어 숫자 정렬 -> 단어 알파벳 정렬 words_list.sort() for word in words_list: print(word[1])