[백준] 1181번 단어 정렬 Python

inkuu·2024년 11월 6일

✖️알고리즘➗

목록 보기
3/23

문제

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

길이가 짧은 것부터
길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.

입력

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

출력

조건에 따라 정렬하여 단어들을 출력한다.

예제 입력 1
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours

예제 출력 1
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate

문제 탐색하기

알파벳 소문자로 이루어진 N개의 단어가 주어졌을 때 조건에 따라 정렬하는 문제.
주어진 조건:

  • 길이가 짧은 것 부터
  • 깉이가 같으면 사전 순으로
    중복된 단어들은 제거 <- 이게 핵심.

가능한 시간복잡도
N log N 정렬 알고리즘으로결정.

알고리즘 선택

set을 사용해 중복 제거.
문제를 해결하기 위해 두 단계로 정렬이 필요.
정렬 알고리즘으로 접근해 보겠습니다.

코드 설계하기

N개의 단어를 입력을 받아 리스트에 저장합니다.
set을 사용해 중복된 단어를 제거합니다.
이번엔 sort()가 아닌 sorted()를 사용해 정렬을 할 것. lambda함수를 사용하여 길이를 우선으로 하고 사전순으로 기준을 정합니다.

  • (sort()가 아닌 sorted()를 사용한 이유는 시도 회차 수정 사항란에서 확인!)

for문으로 정렬된 리스트를 나이 이름순으로 출력합니다.

시도 회차 수정 사항

1회차

  • 중복을 제거하기 위해 set(list_).sort(key=lambda x: (len(x), x)) 이렇게 코드를 작성했는데 에러 발생... 이유는 sort함수는 리스트만 적용이 가능함.. 그래서 sorted함수를 적용! sorted함수는 mutable하지 않은 자료형을 정렬할 때 유용하다고 합니다.

코드 구현

import sys

list_ = []

for i in range(int(sys.stdin.readline())):
    value = sys.stdin.readline().strip()
    list_.append(value)

list_ = sorted(set(list_), key=lambda x: (len(x), x))

for val in list_:
    print(val)

0개의 댓글