코딩테스트/백준

[백준] 10989 : 수 정렬하기 3

Ari_S2 2023. 9. 23. 23:15

문제

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

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net


코드

import sys

n = int(sys.stdin.readline())
nl = [0] * 10001 # n의 범위(인덱스는 -1이므로 10001개 생성)

for _ in range(n):
    nl[int(sys.stdin.readline())] += 1 # 해당 수의 개수만큼 인덱스에 추가 

for i in range(10001):
    if nl[i] != 0: # 인덱스에 수가 있다면
        for _ in range(nl[i]): # 그 갯수만큼 출력
            print(i)
  • for문을 통해 append하면 for 문의 스텝마다 메모리 재할당이 일어나서 속도 저하와 비효율적인 메모리 사용을 야기한다.
  • 따라서 미리 입력 값의 최대 값만큼 리스트를 만들어 둔다.
  • 그 후 리스트의 인덱스에 해당 수의 개수 만큼 값을 추가하고 출력한다.

효율적으로 리스트에 값 추가하기

  • 이렇게 for문을 돌려 list.append()를 하는 방식보다는
a = list(range(100000))
a2 = list()

for i in a:
    a2.append(i*2)
  • 리스트 컴프리헨션 방식이 더 좋고
a2 = [x*2 for x in range(100000)]
  • map과 lambda를 활용한 map( lambda : , 리스트)가 가장 효율적이다.
a = list(range(100000))
a2 = map(lambda n: n*2, a)

  • 참고한 블로그

https://yoonsang-it.tistory.com/49

 

백준 10989번 파이썬 풀이: 수 정렬하기 3

백준 1003번 수 정렬하기 3 알고리즘 분류: 정렬 링크: www.acmicpc.net/problem/10989 10989번: 수 정렬하기 3 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진

yoonsang-it.tistory.com