공부 기록
2024.04.11. 알고리즘
bumm
2024. 4. 11. 14:03
스택과 큐의 차이
스택 - 탑과 같음
입구가 하나 뿐이므로 들어온 놈이 다시 나가야 뒤에 있는 녀석들이 나갈 수 있음
LIFO(Last in First Out)
큐 - 파이프
들어온 게 가장 마지막에 나감
들어오는 구멍과 나가는 구멍이 다름
인풋 구멍과 아웃풋 구멍이 다름!
FIFO(First in First Out)
스택 알고리즘 문제
# 사용자로부터 수열의 길이를 입력받습니다.
N = int(input())
# 입력받은 길이 N에 맞게 리스트 A를 0으로 초기화합니다.
A = [0]*N
# 사용자로부터 N개의 수를 입력받아 리스트 A를 구성합니다.
for i in range(N):
A[i] = int(input())
# 스택을 구현할 리스트를 초기화합니다.
stack = []
# 현재 스택에 추가해야 할 다음 숫자를 관리합니다.
num = 1
# 결과를 판단하기 위한 변수를 True로 초기화합니다. False일 경우 수열을 생성할 수 없음을 의미합니다.
result = True
# 수열 생성 과정을 나타낼 문자열을 초기화합니다.
answer = ""
# 입력받은 수열의 각 요소에 대하여 반복합니다.
for i in range(N):
su = A[i]
# 현재 수열의 요소가 num보다 크거나 같을 경우 스택에 숫자를 추가합니다.
if su >= num:
# su가 num보다 크거나 같을 때까지 스택에 숫자를 추가하고, "+" 연산을 기록합니다.
while su >= num:
stack.append(num)
num += 1
answer += "+\n"
# 수열의 현재 요소에 도달했으므로, 스택에서 해당 요소를 제거하고 "-" 연산을 기록합니다.
stack.pop()
answer += "-\n"
else:
# 스택의 최상단 요소가 현재 수열의 요소보다 큰 경우 수열을 생성할 수 없으므로 "NO"를 출력하고 반복을 중단합니다.
n = stack.pop()
if n > su:
print("NO")
result = False
break
else:
# 스택의 최상단 요소가 현재 수열의 요소보다 작거나 같은 경우, 정상적으로 "-" 연산을 기록합니다.
answer += "-\n"
# 모든 반복이 성공적으로 완료된 경우(수열을 생성할 수 있는 경우), "+"와 "-" 연산의 순서를 출력합니다.
if result:
print(answer)
으앙 어려워
책 74페이지
큐 코드 이해하기 알고리즘
# deque 모듈을 임포트하여 양방향 큐 기능을 사용할 수 있게 합니다.
from collections import deque
# 사용자로부터 카드의 총 개수 N을 입력받습니다.
N = int(input())
# deque 객체를 생성하여 myQueue라는 이름의 큐를 초기화합니다.
myQueue = deque()
# 1부터 N까지의 숫자를 큐에 차례대로 추가합니다. 이는 초기 카드 더미를 나타냅니다.
for i in range(1, N+1):
myQueue.append(i)
# 큐의 길이가 1보다 큰 동안(즉, 카드가 1장 이상 남아 있는 동안) 반복합니다.
while len(myQueue) > 1:
# 큐의 맨 앞(맨 위의 카드)을 제거합니다. 이는 카드를 버리는 동작을 나타냅니다.
myQueue.popleft()
# 큐의 맨 앞의 요소(이제 맨 위의 카드가 됨)를 제거한 후, 이 카드를 큐의 맨 뒤로 옮깁니다.
myQueue.append(myQueue.popleft())
# 반복이 종료되면, 큐에는 마지막으로 남은 카드 한 장만이 남게 됩니다. 이 카드의 번호를 출력합니다.
print(myQueue[0])
슈도코드?
N(카드의 개수) myQueue(카드 저장 자료구조)
for 카드의 개수만큼 반복:
큐에 카드 저장
while 카드가 1장 남을 때까지:
맨 위의 카드를 버림: popleft()
맨 위의 카드를 가장 아래의 카드 밑으로 이동: popleft() -> append()
마지막으로 남은 카드 출력