관리 메뉴

프로그래밍

[백준] 12789번: 도키도키 간식드리미 (Python) 본문

알고리즘

[백준] 12789번: 도키도키 간식드리미 (Python)

시케 2025. 1. 6. 10:13
728x90
반응형

2025.01.03.금

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

 

문제

줄 서있는 곳이나 대기열이나 맨 앞 사람만 이동할 수 있고

대기열에서 줄 서있는 곳으로 가지 못 한다는 사실만 알면 쉽다

Queue나 Stack을 사용해도 되지만 단순하게 파이썬의 리스트만 활용하여 풀어보았다

풀이방식

학생 수와 학생들이 줄을 선 순서를 입력받아 저장한다

대기공간인 리스트(queue)와 현재 나눠줄 번호표인 변수(num)를 선언한다

 

학생들 줄 순서와 대기공간이 있을 경우 다음을 반복한다

 

대기줄 맨 앞 학생의 번호표가 현재 번호표와 일치하는 경우

대기줄에서 pop()을 통해 제거한다

※학생줄에서 대기줄로 넘기는 방식이기 때문에 대기줄과 일치하는지 먼저 검사한다

 

학생줄 맨 앞 학생의 번호표가 현재 번호표와 일치하는 경우

학생줄에서 pop()을 통해 제거

 

학생줄 맨 앞 학생의 번호표가 현재 번호표와 일치하지 않는 경우

학생줄에서 대기줄 맨앞으로 보낸다

 

만족하는 경우가 없으면

즉, 더이상 대기줄이나 학생줄의 맨앞 학생이 번호표와 일치하지 않으며 학생줄이 없을시

대기줄로 넘기지도 못해 고정되었으므로 반복문을 종료한다

 

나누어준 번호표와 학생수를 비교하여 모든 학생이 받았는지 확인한 후

모든 학생이 받았으면 "Nice"를 그렇지 않으면 "Sad"를 출력한다

n = int(input())  # 학생 수
ticket_list = list(map(int, input().split()))  # 학생들 줄 순서

queue = []  # 대기 공간
num = 1     # 현재 와야 할 학생의 번호표

while ticket_list or queue:
    # queue의 맨 앞 학생이 현재 번호와 맞는 경우
    if queue and queue[-1] == num:
        queue.pop()  # queue에서 제거
        num += 1
    # ticket_list의 맨 앞 학생이 현재 번호와 맞는 경우
    elif ticket_list and ticket_list[0] == num:
        ticket_list.pop(0)  # ticket_list에서 제거
        num += 1
    # queue로 이동
    elif ticket_list:
        queue.append(ticket_list.pop(0))
    else:
        break

# 모든 학생이 순서대로 간식을 받았는지 확인
if num - 1 == n:
    print("Nice")
else:
    print("Sad")

 

728x90
반응형
Comments