https://www.acmicpc.net/problem/12789
12789번: 도키도키 간식드리미
인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두
www.acmicpc.net
나의 코드
N = int(input())
arr = list(map(int, input().split()))
stack1 = [] # 한 명씩 설 수 있는 공간
stack2 = [0] # 간식 받는 곳
ans = 'Nice'
for i in range(N):
if not stack1:
if arr[i] != stack2[-1]+1: # 줄을 선 학생의 번호가 간식 받은 학생 번호 +1이 아니라면 대기공간으로
stack1.append(arr[i])
continue
elif arr[i] == stack2[-1]+1: # 줄을 선 학생의 번호가 간식 받은 학생 번호 +1이라면 간식을 받으러
stack2.append(arr[i])
continue
if stack1[-1] >= arr[i]: # 한 명씩 설 수 있는 공간의 학생번호가 크다면
if stack2:
if stack2[-1] + 1 == arr[i]: # 간식 받은 사람보다 줄서있는 학생번호의 수가 1 크다면
stack2.append(arr[i])
else: # 줄 서있는 학생번호가 2이상이면 대기공간으로
stack1.append(arr[i])
else: # 간식받은 사람이 없으면
if arr[i] == 1:
stack2.append(arr[i])
else:
stack1.append(arr[i])
if stack1[-1] < arr[i]: # 한 명씩 설 수 있는 공간보다 현재 서있는 곳의 학생번호가 크다면
ans = 'Sad'
break
while stack2 and stack1 and stack2[-1] + 1 == stack1[-1]:
x = stack1.pop()
stack2.append(x)
print(ans)
결과

스택을 이용한 구현 문제 같은데 계속해서 간식을 받을 경우를 생각했어야 하는 문제였다.
'스터디 1일 1커밋' 카테고리의 다른 글
| 240331 [BOJ/백준] 16493. 최대 페이지 수 (0) | 2024.03.31 |
|---|---|
| 240331 [BOJ/백준] 2805. 나무 자르기 (1) | 2024.03.31 |
| 240327 [BOJ/백준] 9934. 완전 이진 트리 (0) | 2024.03.27 |
| 240326 [BOJ/백준] 2839. 설탕 배달 (1) | 2024.03.26 |
| 240325 [BOJ/백준] 14503. 로봇 청소기 (0) | 2024.03.25 |