이숭간 공부기록

백준 1181번 파이썬 _ 단어 정렬 본문

알고리즘/백준

백준 1181번 파이썬 _ 단어 정렬

이숭간 2021. 2. 13. 23:08
728x90

www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

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

www.acmicpc.net

문제유형 : 문자열, 정렬

문제풀이 :

1순위 정렬 - 문자열 길이기준 : sorted(key=lamda x: len(x)) - 람다함수로 정렬기준 제시

2순위정렬 - 문자열길이가 같을때는 알파벳순 : 디폴트 sort

 

내가푼 방법보다 더 쉬운방법 : lamda를 이용해서 정렬기준의 1순위, 2순위를 한번에 지정하기

배열에 튜플형태로 (문자열, 문자열길이) 로 저장한뒤 해당 배열을 다음과같은 람다식으로 정렬

words_list.sort(key = lambda word: (word[1], word[0]))

words_list가 (문자열길이, 문자열)형태로 저장되있을경우 람다함수 안써도 그냥 sort()만 해줘도 자동으로 길이-> 알파벳으로 정렬함

 

또는 sort()함수는 배열이 튜플형식으로 저장되어있을때, 앞의것이 같으면 뒤를 기준으로 정렬한다.

 

정답코드:

import sys
input = sys.stdin.readline

n = int(input())

input_set = set(input().strip() for _ in range(n)) #중복을 없애기위해 입력값 받아서 집합으로 저장

sorted_list = list(input_set) # 집합을 다시 리스트로

sorted_list.sort(key=lambda x: len(x)) #길이를 기준으로 정렬

list = [] # 같은길이의 문자열을 담아서 재정렬하기위한 리스트
answer = [] # 최종정답 배열

for i in range(1,len(sorted_list[-1])+1): # 길이가 1부터 전체문자열중 최대길이까지
    for _ in range(len(sorted_list)): # sorted_list를 확인하는데 맨앞것만 계속 확인
        if len(sorted_list[0]) == i:   # 길이가 i이면 
            list.append(sorted_list.pop(0)) # i인것들은 list에 담고, sorted_list에서 뺴냄
        else:
            break
    if len(list) > 0: # list길이가 0이면 길이가 i인게 없다는 뜻이므로 다시 반복해야하고 아니면 정렬하고 출력
        for k in sorted(list):  # 같은 길이만 담긴 배열list를 알파벳순으로 정렬하고 프린트
            print(k)
        list = [] # 같은길이인것들은 끝낫으니까 다시 초기화