python/알고리즘 문제풀이

[백준 | 파이썬3] 1181. 단어정렬 - 정렬

빛날희- 2021. 12. 2. 19:08

https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

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

www.acmicpc.net

> 정렬

sort 메서드를 활용해 정렬한다. 정렬 조건으로 첫 번째는 단어의 길이, 두 번째는 단어 사전 순으로 설정했다. 같은 단어는 한번만 출력되기 때문에 8 line 이후의 출력 코드에서 if 문을 통해 이전의 단어와 같은 단어이면 출력되지 않도록 작성했다. 

* 정답으로 통과는 했으나 비효율적인 코드이다.

 

 

▶ 배운점

 

그렇다면 본 코드에서 비효율을 어떻게 개선할 수 있을까?

 

첫 번째론, 중복되는 수를 출력 코드를 길게 쓸 필요 없이 미리 거를 수 있는 방법을 생각하는 것이다. 이에 대해 set 함수를 사용하고자 했다. set함수는 집합함수 이므로 집합 내에서 중복되는 수는 존재할 수 없다. 단 집합구조에선 sort 메소드를 사용할 수 없기 때문에 다시 리스트로 변환한 후 정렬 알고리즘을 적용하는 과정이 필요하다. 

 

두 번째론, 입력단의 구조를 개선하여 값을 입력받는 시간을 줄이는 것이다. 따로 1 line에서 따로 n으로 숫자를 받고 4 line에서 temp로 단어를 입력받는 구조를 없애고 for 문 내에서 바로 값을 입력받을 수 있도록 수정했다. 

 

위 두가지 개선 방법을 적용한 코드는 아래와 같다. 

시간이 거의 1/9로 줄었다. 입력단 구조를 개선하지 않았을 때엔 이전 코드에 비해 100ms밖에 줄지 않았지만 입력단을 바꾸니 시간이 많이 감소했다. 따라서 입력단 코드를 효율적으로 작성하는 것이 중요한 것으로 보인다. 

 

 


포스팅에서 틀린 부분에 대한 피드백 언제나 환영입니다!