본문 바로가기

알고리즘 공부/백준 > Python3

[백준 파이썬] #2751: 수 정렬하기 2

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

 

2751번: 수 정렬하기 2

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

www.acmicpc.net

 

[정답]

import sys

N=int(sys.stdin.readline())

n_list=[]

for i in range(N):

    num=int(sys.stdin.readline())

    n_list.append(num)

n_list.sort()

for k in n_list:

    print(k)


문제들을 풀다보면, 시간초과 에러가 많이 뜬다.

근데 시간초과 에러가 뜨면, 무엇을 고쳐야 하는지 감이 안온다...

 

<시간 초과>

N=int(input())

n_list=[]

for i in range(N):

    num=int(input())

    if num not in n_list:

        n_list.append(num)

n_list.sort()

for i in range(len(n_list)):

    print(n_list[i])

 

<시간 초과>

N=int(input())

n_list=[]

for i in range(N):

    num=int(input())

    if num not in n_list:

        n_list.append(num)

for i in range(len(n_list)):

    print(sorted(n_list)[i])

 

구글링을 해본 결과, 카운팅 정렬(?)과 sys를 사용하면 된다고 하는데,

아직 안 배운 부분이라 이 문제는 나중에 풀기로 하였다.


문제의 입력을 잘 읽어보면, '수는 중복되지 않는다.'라고 쓰여있다.

    if num not in n_list:

        n_list.append(num)

내가 짠 시간 초과 코드에 이부분을 넣었는데 그 이유는 수가 중복될 경우를 제외하기 위해 넣어주었다.

문제를 잘 읽었다면 시간 초과가 되지 않았을 일이었다.

그리고 sys.stdin.readline()함수를 사용해주면 input()함수로 할 때보다 시간이 단축된다! 이 점 기억하자!


not in & in : 멤버 연산자

in : 특정 문자열 또는 값이 문자열 또는 리스트에 속해 있는지 판별하는 연산자

ex) 'py' in 'python' → True

     'ty' not in 'python' → True

 

sorted() & sort()

리스트를 정렬해주는 함수

sort() : 오름차순 정렬 / 본래 리스트 변경O

ex) n_list.sort()

sorted() : 오름차순 정렬 / 본래 리스트 변경X, 정렬한 새 리스트 만듦

ex) a_list=sorted(n_list)