단어 정렬

he2mang·2024년 1월 26일

코딩테스트/python

목록 보기
3/5
post-thumbnail

📌 문제 설명

상세 설명: https://www.acmicpc.net/problem/1181

  • 알파벳 소문자로 이루어진 N개의 단어가 들어오면 다음과 같이 정렬한다.
    - 길이가 짧은 것부터
    - 길이가 같으면 사전 순으로
    - 중복된 단어는 하나만 남기고 모두 제거
  • 입력은 첫째 줄에 단어의 개수 N이 주어진다. (1 <= N <= 20,000)
  • 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나 주어진다. (문자열의 길이는 50을 넘지 않음)

📌 문제 풀이

import sys
n = int(sys.stdin.readline())
words = [sys.stdin.readline().strip() for i in range(n)]
    
words = sorted(list(set(w)))
words.sort(key=len)

for word in words:
	print(word)

제일 먼저 input()을 당연하게 사용했는데, input()은 실행시간이 너무 오래 걸렸다🥲 그래서 sys.stdin.readline()을 사용했다.

  1. sys모듈을 활용한 정수 입력
    여기서 n은 입력 받은 단어의 개수를 의미한다. 간단하게 n = int(input())으로 받아도 무관하다.

  2. words 리스트
    n의 단어를 입력받아 리스트로 저장하는 과정으로, 단어를 입력받은 후 strip()함수를 통해 양쪽 공백을 제거하여 담아 준다. sys.stdin.readline()은 \n을 포함하는 입력이기 때문에 strip()의 과정이 필요하다.

  3. sorted & sort
    입력받은 단어들 중 중복은 하나만 남기고 삭제해주어야 한다. 따라서 중복을 허용하지 않는 set을 이용해 중복을 없애주고 다시 list에 담아준다. 그 후 sorted()를 통해 사전순(오름차순)으로 먼저 리스트를 정렬해 준다. 이때, sorted()는 반드시 변수에 담아주어야 정렬이 적용되기 때문에 유의하여야 한다. 마지막으로 sort()를 key=len으로 지정하여 단어의 길이 순으로 정렬해준다. 다음과 같은 순서로 적용해주면, 단어의 길이를 우선순위로 그리고 길이가 같을 경우 사전순으로 나열된 리스트를 만들 수 있다.

  4. for문
    리스트 안에 정렬된 후 담겨있는 단어들을 차례대로 print()해준다.

💡 sys.stdin.readline()

반복문으로 여러줄을 입력받는 상황에서는 시간초과가 발생하지 않게 하기 위해 sys.stdin.readline()을 사용한다. 이 문제의 경우 문자열 n줄을 입력받아 리스트로 저장해주어야 하기 떄문에 다음과 같이 작성한다.

import sys
n = int(sys.stdin.readline())
words = [sys.stdin.readline().strip() for i in range(n)]
  • strip(): 문자열 맨 앞과 맨 끝의 공백문자 제거

💡 key point

  • sys.stdin.readline()의 사용: 시간 초과 방지
  • 단어길이 >> 사전순: 사전순으로 정렬 후 -> 단어 길이로 정렬

0개의 댓글