Skip to main content

Command Palette

Search for a command to run...

[boj] 10989 수 정렬하기 3

Published
2 min readView as Markdown

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

메모리 초과로 고생을 좀 했다...

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1

10
5
2
3
1
4
2
3
5
1
7

예제 출력 1

1
1
2
2
3
3
4
5
5
7

풀이

  • 메모리 제한이 8MB로 리스트와 힙정렬이나 퀵정렬과 같은 일반적인 정렬 알고리즘을 사용했을 때 메모리 초과가 떴다.
  • Counting sort를 사용해서 입력 받은 nums 이외에 counting에 필요한 메모리만 사용하도록 하여 메모리 사용량을 줄여봤다.
    • 하지만 계속해서 메모리 초과 오류가 떠서 메모리 사용을 줄일 수 있는 곳을 찾아보니 nums를 초기화할 때 list comprehension을 사용하지 않고 generator 표현을 사용하면 메모리 사용을 줄일 수 있다는 것을 찾게 되었다.
    import sys

    input = sys.stdin.readline
    N = int(input())
    # list comprehension 사용으로 리스트를 메모리에 저장하게 됨
    nums = [int(input()) for _ in range(N)]

    # 문제 조건을 참고하여 counts 리스트 선언
    counts = [0] * 10001
    for n in nums:
        counts[n] += 1

    # counting sort
    for i, count in enumerate(counts):
        while count:
            print(i)
            count -= 1
  • 아래와 같이 6번째 줄을 generator 표현으로 바꿈으로써 입력 받은 숫자들을 모두 메모리에 올리지 않고 iteration을 돌 수 있도록 하여 문제를 해결하였다.

      ...
      # generator를 통해서 리스트를 메모리에 두지 않고 nums 입력
      nums = (int(input()) for _ in range(N))
      ...
    
  • 앞으로는 파이썬을 사용할 때 실행속도도 항상 염두에 두고 사용해야겠고 느꼈다.

참고자료

More from this blog

오픈소스 기여모임 10기 후기 - 첫 Pr을 올리기까지

개발자라면 누구나 한 번쯤 오픈소스 기여에 대한 환상을 가져본 적 있을 거다. 하지만 막상 시작하려면 어디서부터 해야 할지 막막하고, 괜히 대단한 걸 해야 할 것 같은 부담감에 선뜻 시작하기는 어려운 것 같다. 나 또한 해보고 싶다는 마음만 가지고 계속 미뤄왔다. 그러다 2025년 말 쯤에 오픈채팅방과 글또 슬랙 채널에서 "오픈소스 기여모임" 10기 모집글을 봤다. 2년 넘게 500명 이상의 참가자와 함께 1000개 이상의 PR을 만들어온 커뮤...

Feb 5, 20265 min read

😢 글또 10기 활동 회고 — “글또야, 가지 마…”

들어가며 드디어 글또 10기 활동 회고를 정리해본다.6개월간의 여정을 뒤돌아보니 정말 많은 일들이 있었다. 글또라는 커뮤니티를 8기가 한창 진행되고 있을 때 알았는데 이름부터 인상이 강렬했다. "글쓰는 또라이가 세상을 바꾼다." 유쾌하고 독특한 문구에 피식 웃으며, '여긴 도대체 어떤 사람들이 모이는 곳이지?' 하고 넘겼었다. 재밌는 건 결국, 나도 그 "또라이들" 중 한 명이 되었다는 것이다. 😌 글또는 개발자들이 2주에 한 번 글을 ...

Jul 31, 20255 min read
😢 글또 10기 활동 회고 — “글또야, 가지 마…”

Serverless 환경에서 배포 전 환경변수 검증 자동화하기: TypeBox와 Bitbucket Pipeline 활용기

들어가며 배포 직후, 환경변수가 제대로 설정되지 않아 여러 API가 제대로 작동하지 않는 일이 있었습니다. 다행히 밤에 사용자가 없을 때 문제가 있었던 거라 영향도는 크지 않았지만 앞으로도 계속해서 발생할 수 있는 문제이기 때문에 해결해야 겠다고 생각했습니다. 개발 단계에서 문제가 발견되면 가장 좋겠지만, 현재 팀 상황에서는 백엔드 개발을 혼자 담당하고 있어 코드 리뷰나 검증 프로세스를 갖추기가 쉽지 않았습니다. 그래서 최소한 배포 전에 자동으...

Mar 16, 20254 min read

Cloudflare Tunnel로 포트포워딩 없이 홈서버 운영하기

이 글에서 다루는 내용 포트포워딩이 안 되는 이유 (CGNAT 환경 이해) CGNAT 우회 방법들의 장단점 비교 Cloudflare Tunnel 설정 방법 (MacOS 기준) 외부에서 내 PC로 접근할 수 있도록 허용하는 방법을 생각하면 포트포워딩이 가장 먼저 떠오릅니다. 공유기에서 특정 포트를 열어 외부에서 서버에 접속할 수 있도록 설정하는 방식으로, 마인크래프트 멀티를 해보셨던 분이라면 분명 해보셨을 방법입니다. 😊 작년에 저는 홈서...

Mar 2, 20256 min read
Cloudflare Tunnel로 포트포워딩 없이 홈서버 운영하기

구름고래 공방

48 posts