본문 바로가기
백준

[백준/Python] 2164 카드2

by 보먀 2024. 8. 5.
728x90
반응형

문제: https://www.acmicpc.net/problem/2164

 

 

사용 알고리즘: 덱

 

 

입력

  • 첫째 줄에 정수 N (1 <= N <= 500,000)

 

N 장의 카드가 순서대로 쌓여있을 때, 카드가 한 장만 남을 때까지 아래의 동작을 반복

1. 맨 위에 있는 카드 제거

2. 제거되고 맨 위로 나온 카드를 맨 아래에 넣음

 

-> 앞뒤로 추가/제거가 가능하니 덱을 사용해 구현해야겠다

 

 

이 문제는 정말 문제대로만 구현하면 되는 간단한 문제였다. 

 

대신 for 문을 N 회가 아닌 (N-1) 회 돌아야 한다. (덱에 카드가 1장 남았을 때 종료해야 하므로)

d = deque(i for i in range(1,N+1)) # 덱에 1~N 번의 카드를 미리 넣음

for i in range(1, N):
    d.popleft() # 맨 위 카드 제거
    d.append(d.popleft()) # 제거되고 위로 나온 카드를 제거해서 맨 아래에 넣음

 

 

출력은 덱에 한 장 남은 카드를 출력해주면 된다. 

print(d[0])

 

 

전체 코드

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

# 입력
N = int(input())

d = deque(i for i in range(1,N+1)) # 덱에 1~N 번의 카드를 미리 넣음

for i in range(1, N):
    d.popleft() # 맨 위 카드 제거
    d.append(d.popleft()) # 제거되고 위로 나온 카드를 제거해서 맨 아래에 넣음

# 출력
print(d[0])

 

 

 

시간 복잡도

 

- 입력

N = int(input()) # O(1)

 

- 나머지 부분

 

popleft / append : O(1)

d = deque(i for i in range(1,N+1)) # O(N)

for i in range(1, N): # O(N-1)= O(N)
    d.popleft()
    d.append(d.popleft())

print(d[0]) # O(1)

# 총 시간 복잡도는 O(N) + O(N) + O(1) = O(N)

 

 

그래서 총 시간 복잡도는 O(1) + O(N) = O(N) 이다.

- 입력: O(1)

- 나머지 부분: O(N)

728x90
반응형

'백준' 카테고리의 다른 글

[백준/Python] 1966 프린터 큐  (0) 2024.08.08
[백준/Python] 11866 요세푸스 문제 0  (0) 2024.08.05
[백준/Python] 24511 queuestack  (0) 2024.08.02
[백준/Python] 2346 풍선 터뜨리기  (0) 2024.08.01
[백준/Python] 9012 괄호  (0) 2024.07.30