문제 설명
26043번: 식당 메뉴
문제
여러 명의 학생이 식사하기 위하여 학교 식당을 향해 달려가고 있다. 학교 식당에 도착한 학생은 식당 입구에 줄을 서서 대기한다. 학교 식당에 먼저 도착한 학생이 나중에 도착한 학생보다 식당 입구의 앞쪽에서 대기한다. 식사는 1인분씩 준비된다. 식사 1인분이 준비되면 식당 입구의 맨 앞에서 대기 중인 학생 1명이 식당으로 들어가서 식사를 시작한다. 식사를 시작한 학생은 항상 식사를 마친다.
학교 식당에서는 두 가지 메뉴가 제공되고 각각의 학생은 두 가지 메뉴 중에서 본인이 좋아하는 메뉴를 결정한 상태다. 학생이 학교 식당에 도착하고 식사가 준비되는 n개의 정보가 저장된 S가 주어진다. S에 저장된 첫 번째 정보부터 n번째 정보까지 순서대로 처리한 경우, 본인이 좋아하는 메뉴를 먹은 학생 목록 A와 본인이 좋아하지 않는 메뉴를 먹은 학생 목록 B와 학교 식당에 도착하였으나 식사를 하지 못한 학생 목록 C를 출력하자.
S에 저장된 n개의 식당 정보는 아래 두 가지 유형으로 구분된다. 첫 번째가 유형 1, 두 번째가 유형 2다.
- 1 a b: 학생 번호가 양의 정수 a이고 좋아하는 메뉴 번호가 양의 정수 b인 학생 1명이 학교 식당에 도착하여 식당 입구의 맨 뒤에 줄을 서기 시작한다.
- 2 b: 메뉴 번호가 양의 정수 b인 식사 1인분이 준비되어 식당 입구의 맨 앞에서 대기 중인 학생 1명이 식사를 시작한다.
식사 1인분이 준비될 때는 식당 입구에서 대기 중인 학생이 항상 존재한다. 식당 입구에 줄을 서서 대기하였으나 식사가 준비 안 된 학생은 식사를 못 한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
첫 번째 줄에 학생 목록 A에 있는 학생 번호를 빈칸을 사이에 두고 오름차순으로 출력한다.
두 번째 줄에 학생 목록 B에 있는 학생 번호를 빈칸을 사이에 두고 오름차순으로 출력한다.
세 번째 줄에 학생 목록 C에 있는 학생 번호를 빈칸을 사이에 두고 오름차순으로 출력한다.
학생 목록에 학생이 없는 경우 학생 번호 대신 None을 출력한다.
입출력 예 설명
입력 1
6
1 2 1
1 1 1
2 1
1 3 2
2 2
2 2
출력 1
2 3
1
None
💻내가 짠 코드
import sys
from collections import deque
def process_cafeteria(n, operations):
queue = deque()
A, B, C = [], [], []
for op in operations:
parts = list(map(int, op.split()))
if parts[0] == 1:
# 학생 도착 (학생 번호, 선호 메뉴)
a, b = parts[1], parts[2]
queue.append((a, b))
else:
# 식사 준비됨 (메뉴 번호)
b = parts[1]
student, preferred_menu = queue.popleft()
if preferred_menu == b:
A.append(student)
else:
B.append(student)
# 식사하지 못한 학생들
while queue:
C.append(queue.popleft()[0])
# 결과 출력
print(" ".join(map(str, sorted(A))) if A else "None")
print(" ".join(map(str, sorted(B))) if B else "None")
print(" ".join(map(str, sorted(C))) if C else "None")
# 입력 처리
n = int(sys.stdin.readline().strip())
operations = [sys.stdin.readline().strip() for _ in range(n)]
process_cafeteria(n, operations)
✍ 접근 방법
- 학생 대기열 처리: deque를 사용해 학생 번호와 선호 메뉴를 대기열에 추가하고 빠르게 처리.
- 학생 도착 시 처리: 학생 도착 시 (학생 번호, 선호 메뉴)를 queue에 추가.
- 식사 준비 시 처리: 메뉴가 준비되면 queue에서 학생을 꺼내, 선호 메뉴와 일치하면 A에, 일치하지 않으면 B에 추가.
- 식사 못한 학생 처리: 대기열에 남은 학생은 C에 추가.
- 결과 출력: 각 그룹(A, B, C)을 번호순으로 출력, 없으면 "None".
'Study > Python' 카테고리의 다른 글
[99클럽 코테 스터디] 17일차 TIL - Relative Ranks (0) | 2025.02.12 |
---|---|
[99클럽 코테 스터디] 15일차 TIL - 균형잡힌 세상 (0) | 2025.02.07 |
[99클럽 코테 스터디] 13일차 TIL - 큐 (0) | 2025.02.06 |
[99클럽 코테 스터디] 12일차 TIL - 막대기 (0) | 2025.02.05 |
[99클럽 코테 스터디] 11일차 TIL - 스택 (0) | 2025.02.03 |