본문 바로가기
백준

[백준] 12789번 : 도키도키 간식드리미 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 12. 3.
728x90
반응형

 

 

12789번: 도키도키 간식드리미

인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두

www.acmicpc.net

 

1. 문제 설명

2. 풀이과정

해당 문제는 승환이가 간식을 받을 수 있는지 없는지 판별하는 문제이다.

승환이가 간식을 받으려면 승환이 앞에 서 있는 학생들이 모두 간식을 받아야 한다.

대기열은 한 사람씩 들어갈 수 있고 마지막으로 들어온 순서대로 나갈 수 있으므로 스택 구조를 활용한다.

대기열의 제일 뒤에 서 있는 학생이 현재 순서인지 먼저 판별하고 그게 아니면 현재 줄 서 있는 학생을 차례대로 판별하며 간식을 주거나 대기열로 보낸다.

서 있는 학생을 다 판별했다면 대기열에 남아있는 학생을 순서대로 판별하여 모든 학생이 간식을 받았는지 확인한다.

 

  1. sys.stdin.readline() 함수를 사용하기 위해 sys 모듈을 불러온다. import sys
  2. 앞에 서 있는 학생의 수를 입력받는다. N = int(sys.stdin.readline())
  3. 학생들의 번호를 입력받아 리스트로 저장한다. wait = list(map(int, sys.stdin.readline().split())
  4. 대기열에 서 있는 학생을 저장할 스택을 생성한다. stack = list()
  5. 현재 번호의 순서를 저장할 변수를 생성하고 1을 저장한다. num = 1
  6. 앞에 서 있는 학생이 다 빠질 때까지 반복하며 while (wait)
  7. 만약 대기열에 학생이 있을 때, 대기열의 제일 뒤에 서 있는 학생이 해당 순서이면 if (len(stack) > 0) and (stack[-1] == num)
  8. 해당 학생에게 간식을 주고 stack.pop()
  9. 다음 순서로 넘어간다. num += 1
  10. 그게 아닐 때 else
  11. 만약 현재 학생이 해당 순서이면 다음 순서로 넘어간다. if (wait[0] == num): num += 1
  12. 그게 아니면 학생을 대기열로 보낸다. else: stack.append(wait[0])
  13. 해당 학생을 줄에서 제거한다. del wait[0]
  14. 대기열에 있는 학생이 다 빠질 때까지 반복하며 while (stack)
  15. 만약 대기열에 제일 뒤에 있는 학생이 번호의 순서이면 if (stack[-1] == num)
  16. 해당 학생에게 간식을 주고 stack.pop()
  17. 다음 순서로 넘어간다. num += 1
  18. 그게 아니라면 더 이상 간식을 받을 수 있는 학생이 없으므로 종료한다. else: break
  19. 만약 앞에 서 있던 학생 모두가 간식을 받았다면 if (len(stack) == 0)
  20. 승환이도 간식을 받을 수 있으므로 Nice를 출력한다. print('Nice')
  21. 반면에 앞에 서 있던 학생 중 간식을 못 받은 학생이 있다면 else
  22. 승환이도 간식을 받을 수 없으므로 Sad를 출력한다. print('Sad')
반응형

3. 소스코드

import sys

N = int(sys.stdin.readline())

wait = list(map(int, sys.stdin.readline().split()))
stack = list()
num = 1
while (wait):
    if (len(stack) > 0) and (stack[-1] == num):
        stack.pop()
        num += 1
    else:
        if (wait[0] == num):
            num += 1
        else:
            stack.append(wait[0])

        del wait[0]

while (stack):
    if (stack[-1] == num):
        stack.pop()
        num += 1
    else:
        break

if (len(stack) == 0):
    print('Nice')
else:
    print('Sad')
728x90
반응형