본문 바로가기

스터디 1일 1커밋

240328 [BOJ/백준] 12789. 도키도키 간식드리미

 

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)

 

결과


스택을 이용한 구현 문제 같은데 계속해서 간식을 받을 경우를 생각했어야 하는 문제였다.