• TOC {:toc}

이 글은 백준 온라인 저지의 10989번 문제를 파이썬(Python)으로 풀이한 것을 모아놓은 글입니다.

일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.

2021.05.15

재채점 결과 틀린 풀이입니다 (결과: 시간 초과). 아래의 풀이나 참고 답안을 참고해주세요.

메모리 시간 코드 길이
29832 KB 10076 ms 228 B
단계 시작 시각 끝난 시각 걸린 시간
문제 이해 15:53:55 15:54:00
풀이 생각 15:54:02 15:54:04
코딩 1 15:54:11 16:08:39
코딩 2 16:08:40 17:17:54
import sys
input = sys.stdin.readline

L = {}
for _ in range(int(input())):
    n = int(input()) 
    if n in L:
        L[n] += 1
    else:
        L[n] = 1

for i in sorted(L.keys()):
    for _ in range(L[i]):
        print(i)

디버그

  • 입력받은 모든 수를 그대로 리스트로 구성했더니 메모리 초과가 났다.

피드백

  • 입력값을 딕셔너리의 key가 아니라 리스트의 인덱스로 사용하면 따로 sort() 하지 않고도 정렬해서 출력할 수 있다.

2021.07.27 (재채점 후)

메모리 시간 코드 길이
29708 KB 9008 ms 177 B
단계 시작 시각 끝난 시각 걸린 시간
풀이 생각 23:22:25 23:22:54
코딩 23:22:56 23:27:45
import sys
input = sys.stdin.readline

L = [0] * 10001
for _ in range(int(input())):
    L[int(input())] += 1

for i in range(10001):
    for _ in range(L[i]):
        print(i)

아이디어 & 풀이

  • 딕셔너리가 아닌 리스트로 작성해 key를 sort 하는 과정을 생략해 시간을 줄였다.
  • 참고 답안과 유사한 답안이다.

2022.03.19 (JS)

JS로는 무조건 메모리 초과가 발생하는 것 같다. 정답 여부 알 수 없음.

단계 시작 시각 끝난 시각 걸린 시간
문제 이해 22:20:32 22:21:04
풀이 생각 22:21:05 22:21:15
코딩 22:21:17 22:29:42
const fs = require("fs");
const input = fs.readFileSync('/dev/stdin').toString().trim().split("\n");

input.shift();

function main(num) {
    const res = [];
    const count = Array(10001).fill(0);
    num.forEach((n) => (count[n] += 1));

    for (const [i, n] of count.entries()) {
        for (let j = 0; j < n; j++) {
            res.push(i);
        }
    }
    return res.join("\n");
}

console.log(main(input));

참고 답안

f = open(0)
# 처음의 수의 개수 입력을 넘긴다.
f.readline()
L = [0] * 10001

# 각 입력한 줄을 읽을 때마다.
for line in f:
    # 입력값을 인덱스로 하는 원소의 수를 1 증가시킨다.
    L[int(line)] += 1

# 1부터 10000까지
for i in range(1, 10001):
    # 순서대로 해당 값이 입력된 횟수만큼 출력한다.
    print(f"{i}\n" * L[i], end="")