isPowerfulBlog
[re-Solved] BOJ: 2164 | 카드2 본문
뭔가 속도 차가 확실히 나니까 작고 소중한 코드 고치기 재밌다...히히...
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연산이 하는 일은 다음과 같다
- 마지막 요소를 가져옴
- 그 요소를 deque에서 제거
- deque의 크기 조정
- 요소를 반환
- 반면 인덱싱([0])은
- 단순히 첫 번째 요소를 참조만 함
- 따라서 반드시 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 |