[Python / 파이썬] 백준 1181번

재수강은방학때·2021년 4월 13일
3

백문 문제풀이

목록 보기
1/2

문제 링크 : 백준 1181번

요약

  1. sort는 문자열도 정열해준다.
  2. input()은 겁나 느리다.

1181번

단어를 정렬하는 문제다.
처음 봤을 땐 ord를 사용해 유니코드값을 이용해야겠다고 생각했지만, sort 정렬이 문자까지 정렬해주는 줄 처음 알게됐다.

n = int(input())
lst = []

for i in range(n):
    lst.append(input())

lst.sort()	## 괄호 안에 아무 값도 넣지 않으면 알파벳 순서대로 정렬을 해 준다.
lst.sort(key = len)	## 문자열 길이 순으로 정렬.

for i in lst:
    print(i)

정렬 순서를 주의해야 되는데, 상위 조건 A와 하위 조건 B가 있으면
먼저 B로 정렬을 한 후에 A로 정렬을 해야 원하는 결과를 얻을 수 있다.

문제에서 중복은 출력하지 말라는 조건을 안보고 제출하는 바람에 탈락.

n = int(input())
lst = []

for i in range(n):
    lst.append(input())
set_lst = set(lst)	## set으로 변환해서 중복값을 제거
lst = list(set_lst)	## 다시 list로 변환
lst.sort()
lst.sort(key = len)

for i in lst:
    print(i)

sort는 변환된 값을 변수에 저장까지 해준다. 덕분에 lst.sort() 이후 나오는 lst는 정렬된 값을 그대로 출력한다.
하지만 set(lst)같은 명령은 단순히 lst를 set으로 바꿔줄 뿐이지, 그 타입을 그대로 lst라는 변수에 저장해주지 않는다.
그렇기 때문에 set_lst라는 변수를 선언해서 그 값을 따로 저장해주고, 그 값을 list로 다시 변환해준다.
input()으로 값을 받는 이 코드는 1028ms 시간이 걸렸다.

import sys

n = int(sys.stdin.readline())
lst = []

for i in range(n):
    lst.append(sys.stdin.readline())	## 여기가 문제
set_lst = set(lst)
lst = list(set_lst)
lst.sort()
lst.sort(key = len)

for i in lst:
    print(i)

input()과 sys.stdin.readline()의 속도를 비교해보기 위해서 답안 제출을 했는데, 출력 형식이 잘못되었다면서 오답으로 결과가 나왔다.
알아보니 이유는 sys.stdin.readline()은 '\n\'을 포함하는 입력이기 때문에 연속으로 값을 입력받는 for문에서 에러가 발생했다.

import sys

n = int(sys.stdin.readline())
lst = []

for i in range(n):
    lst.append(sys.stdin.readline().strip())
set_lst = set(lst)
lst = list(set_lst)
lst.sort()
lst.sort(key = len)

for i in lst:
    print(i)

그래서 .strip()입력해주니까 통과.
시간은 108ms가 나왔다. input()과 비교했을 때, 거의 1/10 수준의 빠르기다.

profile
베짱이는뚠뚠오늘도뚠뚠열심히뚠뚠일을한다

0개의 댓글