현제의 현재이야기

[백준/python] 12789 - 도키도키 간식드리미 본문

algorithm

[백준/python] 12789 - 도키도키 간식드리미

현재의 현제 2022. 6. 29. 01:49

from collections import deque

a = int(input())
current = deque(map(int, input().split()))
cnt = 1 
solo_count = 0  # 한줄로 서있는 스택의 개수
while cnt < a:
    if solo_count != len(current) and current[0] == cnt:
        current.popleft()
        cnt += 1
    elif solo_count >= 1 and current[-1] == cnt:
        current.pop()
        solo_count -= 1
        cnt += 1
    else:
        if solo_count == len(current):
            if current[-1] != cnt:
                print('Sad')
                break
        current.rotate(-1)
        solo_count += 1
if cnt == a:
    print('Nice')

| 알고리즘

  1. 검사해야하는 수의 번째인 cnt가 a보다 작을 때 까지 while 반복
  2. 만약 스택(밑으로 한줄로 줄서는)에 모든 사람이 오지 않았고 현재 줄 서 있는 맨 앞 사람이 cnt라면 팝하고 cnt + 1
  3. 만약에 스택에 한 사람이라도 있고 스택 맨 뒷사람이 cnt와 같다면 pop하고 스택 카운트 -1하고 cnt 1 증가
  4. 그게 아니라면 왼쪽으로 로테이트 1회하고 스택 1회 증가

단, 줄 서는 사람들이 모두 스택에 들어왔고, 스택 맨 뒷사람이 cnt와 같지 않다면 스택 앞 사람들은 간식을 받지 못함으로 sad를 출력

   5. while 문을 빠져나오고 cnt가 a, 즉 모두에게 간식을 나누어 주었다면 nice 출력

 

 

그냥 데크 여러개 두고 넣고 빼고 할 수 있었는데 로테이트와 데크 하나로 만들고 싶었다. 괜히 더 어려운 길일 지도?

처음에 8줄에 solo_count != len(current), 즉 스택에 모든 사람들이 안왔을 때를 가정하지지 않아서

이 예시가 nice가 떴었다.(차례로 current, cnt, solo_count)

왜냐하면 8줄에 저것이 없으면

이것과 같이 줄서있는 사람이 없고 스택에만 있음에도 불구하고 8줄의

current[0] == cnt가 실행되어서 스택의 첫번째 사람을 조회해버린다. 그러면 곤란

 

https://www.acmicpc.net/problem/12789

Comments