알고리즘/Python

백준 알고리즘: 2750번 수 정렬하기 (Python)

두넌 2023. 5. 16.

문제 정보


 

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

 

핵심


사실 이 문제의 핵심이 있을까?

정렬 알고리즘이 최악의 경우에도 O(N^2) 이고, 문제에서 주어진 N의 최대 개수는 1,000에 불과하므로 
최악의 경우 1,000,000 (백만 번)만 반복하면 되니까 아마 최악의 경우에서도 성공이 가능하지 않을까 싶다

하지만, Java도 그랬지만 Python도 .sort() 함수를 사용하면 평균 O(NlogN)의 시간복잡도로 정렬을 수행할 수 있기 때문에
정렬 함수를 따로 구현하거나 하지 않아도 되는 쉬운 문제였던 것 같다

 

풀이


N = int(input())

nums = []
for i in range(N):
    nums.append(int(input()))

nums.sort()

for num in nums:
    print(num)

나는 그냥 단순하게 이 문제를 풀이했던 것 같다

N번 반복해서 nums 배열에 숫자들을 추가시키고, sort() 함수를 통하여 배열을 정렬했다
그리고 출력!

고찰


다른 분들의 풀이를 참고하여 나의 코드스타일과 더 좋은 풀이법을 발견하고자 하였다

import sys

n = int(input())
l = [int(sys.stdin.readline()) for _ in range(n)]

for i in sorted(l):
    print(i)

 

일단 이분은, 내가 능숙하지 못한 sys 라이브러리를 통하여
sys.stdin.readline() 으로 한 줄을 읽어들인 것 같다

이 라이브러리를 사용하면 이전 게시물에 정리했지만(https://dduneon.tistory.com/33) 빠르게 입출력을 수행할 수 있다

또한, 배열을 list comprehension 문법 구조를 사용하여 for 문을 n 번 반복하여 리스트에 읽어들인 값을 넣어주었다
이 부분을 활용하면 코드의 간결성을 더 늘릴 수 있을 것 같다

 

import sys

b = input()
a = list(map(int, sys.stdin.read().split()))
a.sort()
for i in a:
    print(i)

두번 째 분인데, 이 분은 아예 sys.stdin.read()로 남은 문장 전체를 읽어들여서 split()으로 list를 생성하셨다

이렇게 활용할 수 있을줄은 몰랐는데 앞 코드보다 더 간결하게 사용할 수도 있는 것 같다

sys.stdin.readline()은 한 줄을 읽고 sys.stdin.read()는 버퍼에 있는 내용 모두를 읽어들이는 함수인 것이라 정리하였다
못참고 바로 정리하기 게시물(https://dduneon.tistory.com/35) 참고

댓글