본문 바로가기
  • 초부득3 - 어제보다 나은 내일을 위해
  • 꿈이 현실이 되는 날까지
sw사관학교 정글 2기/01 기초,재귀,완전탐색, 정렬

[정렬] 백준 1181번 단어 정렬 with Python3

by 금의야행 2021. 8. 10.

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

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

문제

 

내 풀이

n = int(input())

a = []
for i in range(n):
    inp = input()
    if [len(inp), inp] not in a:
        a.append([len(inp), inp])

a.sort(key=lambda x: (x[0], x[1]))

for i in range(len(a)):
    print(a[i][1])

해설

풀긴했으나 너무 비효율적으로 풀었다. 걸리는 시간이 다른 사람과 비교해 10배 정도 차이가;;

 

거기가 lambda 활용이 좋지 않았다.

정답 풀이

import sys
n = int(input())

dic = list(set([sys.stdin.readline().strip() for _ in range(n)]))

dic = sorted(dic, key=lambda x: (len(x), x))

print('\n'.join(dic))

출처:https://velog.io/@cosmos/BOJ-1181-python

https://www.acmicpc.net/source/16465719

 

해석

 sys.stdin.readline()은 '\n\'을 포함하는 입력이기 때문에 연속으로 값을 입력받는 for문에서 에러가 발생했다.

그래서 .strip()입력해주니까 통과.

 

key를 람다를 통해 두개를 동시에 주는게 인상적이다. 물론 나도 그렇게 사용햇지만, 이를 위해 일부러 dic 자료형으로 list에 넣었었다. 하나의 원소만으로도 두개의 조건으로 sort 함수를 이용할 수 있음을 기억하자.

 

또한 list에 저장된 정답을 for문으로 출력하지 않고, join함수로 한번에 출력한다는 점이 인상깊다.

 

다만 구분자 없이 할경우 이 문제에서 요구되는 형식으로 출력이 안됨으로 \n이라는 줄바꾸기를 구분자로 넣었다.

댓글