ProblemSolving/정렬

백준 1181 단어정렬 (파이썬)

OSNIM 2022. 5. 13. 00:39
반응형

문제 : https://www.acmicpc.net/problem/1181

 

 

첫번째 풀이 (정답)

import sys
from collections import defaultdict
input = sys.stdin.readline
n = int(input().strip())
datas = set() # 1. 중복제거
dic = defaultdict(list) # 디폴트딕셔너리 = 키값이 없어도 바로 키랑 값 넣을 수 있음

for i in range(n):
    s = input().strip()
    datas.add(s)
#2. 순서대로 정렬
datas = sorted(list(datas), key=lambda x:len(x))

# 3. 길이에 따라 딕셔너리에 구분
for s in datas:
    dic[len(s)].append(s)

#4. 길이 별로 문자열 순서로 정렬
for k in dic.keys():
    dic[k].sort()
    for i in range(len(dic[k])):
        print(dic[k][i])

정렬하는 과정이 복잡하고 

 

두번째 풀이

관점을 바꿔서 알파벳 순서로 정렬을 한 뒤, 길이로 정렬

import sys
from collections import defaultdict
input = sys.stdin.readline
n = int(input().strip())
datas = set() # 1. 중복제거

for i in range(n):
    s = input().strip()
    datas.add(s)

datas = list(datas)
#사전순으로 정렬
datas.sort()
#3. 순서대로 정렬
datas = sorted(list(datas), key=lambda x:len(x))

for s in datas:
    print(s)

 

세번째 풀이

import sys
input = sys.stdin.readline
n = int(input().strip())
datas = []
for i in range(n):
    s = input().strip()
    datas.append((len(s), s))
# 중복 제거
datas = list(set(datas))

datas.sort()

for s in datas:
    print(s[1])

 

문자와 길이를 하나로 묶어 저장

주의사항 두 원소를 묶고 set으로 변환해서 중복을 제거할 경우 set의 원소는 list가 불가능 하고 튜플만 가능

list를 넣으면 TypeError: unhashable type: 'list' 에러 발생

 

 

 

 

 

반응형