isPowerfulBlog

[re-Solved] BOJ: 2164 | 카드2 본문

Algorithm

[re-Solved] BOJ: 2164 | 카드2

왕밤빵도라에몽 2024. 12. 11. 20:20

뭔가 속도 차가 확실히 나니까 작고 소중한 코드 고치기 재밌다...히히...

 

4년 전 코드 

import sys
import collections

input = sys.stdin.readline

N = int(input())

deque = collections.deque([i for i in range(1, N+1)])

while len(deque) > 1:
    deque.popleft()
    deque.rotate(-1)

print(deque[0])

 

  • (good) sys.stdin 써서 입력 관리
  • (bad) rotate 저건 왜 쓴거 굳이 -> 모든 요소를 한 칸씩 이동시킴 (오버스펙;;:)

개선 코드

from collections import deque
import sys
input = sys.stdin.readline

if __name__ == "__main__":
    n = int(input())
    cards = deque(range(1, n+1))

    while len(cards) > 1:
        cards.popleft()
        cards.append(cards.popleft())

    sys.stdout.write(str(cards[0]) + "\n")

  • (good) sys.stdin, sys.stdout으로 입출력 관리 / pop과 append만 써서 요구사항에 대해서만 대응
  • (good) deque에 리스트 대신 range객체 넣기 -> 불필요한 리스트 생성X
  • (good) 맨 마지막에 요소 출력하는 것을 pop()이 아니라 인덱스로 조회하도록 해서 불필요한 연산 방지

배운점 / 다시 상기한 점

  • deque 처음 초기화 시, 리스트 대신 range객체를 넣어주면 불필요한 리스트 생성을 막을 수 있다.
    • deque은 iterator 생성자를 받을 수 있음! / range도 iterator 생성자의 일환
  • deque에서 pop연산이 하는 일은 다음과 같다
    1. 마지막 요소를 가져옴
    2. 그 요소를 deque에서 제거
    3. deque의 크기 조정
    4. 요소를 반환
  • 반면 인덱싱([0])은
    1. 단순히 첫 번째 요소를 참조만 함
  • 따라서 반드시 pop을 해야하는 상황이 아니라면 인덱스 조회를 하자!

'Algorithm' 카테고리의 다른 글

[re-Solved] BOJ: 10773 | 제로  (0) 2024.12.11
[Solved] BOJ: 1920 | 수 찾기  (0) 2024.12.11
[re-Solved] BOJ: 10828 | 스택  (0) 2024.12.10
[re-Solved] BOJ: 9012 | 괄호  (0) 2024.12.10
[re-Solved] BOJ: 10845 | 큐  (0) 2024.12.10