1181번: 단어 정렬 이 문제를 보고 떠오른 생각은 이전에 사용하려고 했던 방식인 문자를 아스키코드로 변환하여 숫자로 저장한 다음 숫자로 정렬할 생각이었다. 그래서 구현한 함수가 아래와 같다.

1
2
3
4
5
6
7
def trans_string_to_number(m_string):
    result = 0
    weight = 2 ** len(m_string)
    for x in m_string:
        result += (ord(x) * weight)
        weight /= 2
    return result

처음 가중치를 그냥 길이 만큼 주었을 때에는 사전순 정렬이 제대로 동작하지 않아서 위와같이 구현하였다. 일단 제시된 케이스에는 정상적으로 동작하지만 ‘틀렸습니다’가 나왔다. 아무리 생각해도 50자까지 입력을 받는 만큼 50자를 받았을때 (2^50)*64 이런 식으로 계산되는데 범위가 초과해서 그런게 아닐까 싶다. 여하지간 그래서 파이썬 기본 기능인 정렬을 사용했다.

문제가 길이순으로 먼저 정렬하고 사전순으로 정렬하는 것이기에 다중 조건으로 정렬을 실시하면 된다. 중복된 문자는 제외해도 된대서 tuple에 입력받았던 값을 받아뒀다가 없으면 dict를 추가하도록 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if __name__=='__main__':
    N = int(input())
    words = list()
    words_set = tuple()
    
    for i in range(N):
        word = str(input())
        if not word in words_set:
            words.append({
                'word': word,
                'len': len(word),
            })
        words_set += (word,)
    
    words = sorted(words, key=lambda x : (x['len'], x['word']))

    for x in words:
        print(x['word'])

위와같이 아주 간단하게 해결할 수 있다. key는 위와같이 람다식으로 작성해도 되고 일반 함수로 작성해놔도 된다.

WRITTEN BY

배진오

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
im@baejino.com