문제
2164번: 카드2
N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가
www.acmicpc.net
풀이 (Python)
from collections import deque
n=int(input())
queue=deque()
for i in range(1,n+1):queue.append(i)
while True:
if len(queue)==1:
break
queue.popleft()
queue.append(queue[0])
queue.popleft()
print(*queue)
설명 (Python)
설명과 함께 첫 풀이 과정으로 풀이하겠다.
문제에서 제시한 것과 같이 for문을 통해 리스트에 1~n까지의 숫자를 넣어준다.
for i in range(1,n+1):queue.append(i)
queue[0]이 가장 위라고 생각하고 문제에서 제시한 행동( 1. 맨 위의 카드를 버린다. / 2. 맨 위의 카드를 아래로 내린다.) 이 두 가지 행동을 반복하는 부분은 다음과 같이 간단하게 작성 가능하다.
queue.pop(0)
queue.append(queue[0])
queue.pop(0)
반복해야하기 때문에 while문에 위의 행동을 넣어서 코드를 완성하면 다음과 같다.
n=int(input())
queue=[]
for i in range(1,n+1):queue.append(i)
while True:
if len(queue)==1:
break
queue.pop(0)
queue.append(queue[0])
queue.pop(0)
print(*queue)
하지만 이와 같이 풀이시에 시간초과가 발생한다.
keypoint 1- list와 deque의 시간복잡도
list의 pop(0)의 경우 시간복잡도가 O(n)이지만 deque의 popleft()는 시간복잡도가 상수시간인 O(1)이다.
그러므로 list를 사용하여 queue로 작성하는 풀이가 아닌 deque를 활용하여 queue를 작성하여야한다.
deque는 아래와 같이 import하여 사용할 수 있다.
from collections import deque
queue=deque()
list를 활용한 큐로 푼 풀이 코드에서 list대신 deque를 사용하고 pop(0) 대신 popleft()로 바꾸기만 하면 시간초과 문제는 간단하게 해결된다.
from collections import deque
n=int(input())
queue=deque()
for i in range(1,n+1):queue.append(i)
while True:
if len(queue)==1:
break
queue.popleft()
queue.append(queue[0])
queue.popleft()
print(*queue)
큐의 자료구조 개념에 대해서는 아래의 글을 참조 하길 바란다.
[알고리즘] 자료구조 개념 / 스택, 큐, 덱, 힙 ( Stack, Queue, Deque, Heap)
자료구조 개념 자료구조란? 데이터를 구조적으로 활용하기 위해 표현하는 것을 말한다. 자료구조는 알고리즘 공부 전 필수적으로 알고 넘어가야 하는 부분이며, 알고리즘 문제의 대부분은 자료
yesdohyun.tistory.com
'Baekjoon' 카테고리의 다른 글
[백준] 1343번 폴리오미노 (파이썬) (1) | 2023.09.19 |
---|---|
[백준] 28278번 스택 2 (파이썬) (0) | 2023.09.07 |
[백준] 11279번 최대 힙 ( 파이썬 ) (1) | 2023.07.31 |
[백준] 11726번 2xn 타일링 ( 파이썬 / c언어 ) (0) | 2023.07.26 |
[백준] 9461번 파도반 수열 ( 파이썬) (0) | 2023.07.26 |