본문 바로가기
Algorithm/백준

[Python] 백준 1181번 - 단어 정렬

by 애기 개발자 2022. 10. 4.
반응형

문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

입력

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

출력

조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.

 


우선 문제를 보자마자 단어의 개수 2만개, 각 단어 길이는 최대 50

이 조건을 보고 '아 최근에 본 import sys 를 써야겠구나' 싶었고

 

중복은 제거한다 = list -> set -> list로 바꿔서 사용하라 라는 것을 알았다.

 

문제는 문자열 길이별로 정렬 + 알파벳 정렬인데...

 

처음에는 

 

import sys
n = int(sys.stdin.readline())
data = [0] * 51
for i in range(n):
  s = sys.stdin.readline().strip()
  data[len(s)].append(s)

위의 방법으로 하려고 했다.

 

2022.09.29 - [Algorithm/백준] - [Python] 백준 10989번 - 수 정렬하기 3

 

[Python] 백준 10989번 - 수 정렬하기 3

문제 N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수

baby-dev.tistory.com

 

위의 문제처럼

 

data = [0] * 51 로 문자열 최대 길이만큼 배열을 만들고

 

해당 문자열 길이에 맞는 index 위치에 입력받은 문자열을 append() 하려고 했다.

 

하지만 잘못된 생각이었고 난 Python의 list를 C의 포인터처럼 사용할 수는 없을까? 하고 찾아봤으나...

 

아직 파이썬 초보에겐 너무 어려운 방법인 것 같았다.

 

C언어의 위와 같은 그림을 원했는데 아직 파이썬으로 저런 걸 구현하기는 내실력으론 무리였다.

 

그래서 기존에 알고 있던 sort() 기능에 대해서 좀 더 알아보았다.

 

sort()에 key를 지정하여 어떤 방식으로 정렬을 할지 정할 수 있다는 것이다.

import sys

n = int(sys.stdin.readline())
data = []
for i in range(n):
  data.append(sys.stdin.readline().strip())

set_data = set(data)
data = list(set_data)
data.sort()
data.sort(key = len)
for i in data:
  print(i)

참고로 

data.sort()

data.sort(key = len)

 

두 줄의 위치가 바뀌면 오답이다.

 

정답은

알파벳 정렬 -> 길이 정렬이고

 

반대로

길이 정렬 -> 알파벳 정렬 을 하면

 

but
cannot
hesitate
i
im
it
more
no
wait
wont
yours

위의 정답이 나온다.

 

반응형

댓글