식당 입구 대기줄 26042번
시간제한 | 메모리 제한 |
0.1초 | 512MB |
문제
여러 명의 학생이 식사하기 위하여 학교 식당을 향해 달려가고 있다. 학교 식당에 도착한 학생은 식당 입구에 줄을 서서 대기한다. 학교 식당에 먼저 도착한 학생이 나중에 도착한 학생보다 식당 입구의 앞쪽에서 대기한다. 식사는 1인분씩 준비된다. 식사 1인분이 준비되면 식당 입구의 맨 앞에서 대기 중인 학생 1명이 식당으로 들어가서 식사를 시작한다. 식사를 시작한 학생은 항상 식사를 마친다.
학생이 학교 식당에 도착하고 식사가 준비되는 n개의 정보가 저장된 A가 주어진다. A에 저장된 첫 번째 정보부터 n번째 정보까지 순서대로 처리한 다음, 식당 입구에 줄을 서서 대기하는 학생 수가 최대가 되었던 순간의 학생 수와 이때 식당 입구의 맨 뒤에 대기 중인 학생의 번호를 출력하자. 대기하는 학생 수가 최대인 경우가 여러 번이라면 맨 뒤에 줄 서 있는 학생의 번호가 가장 작은 경우를 출력하자.
A에 저장된 n개의 정보는 아래 두 가지 유형으로 구분된다. 첫 번째가 유형 1, 두 번째가 유형 2이다.
- 1 a: 학생 번호가 양의 정수 a인 학생 1명이 학교 식당에 도착하여 식당 입구의 맨 뒤에 줄을 서기 시작한다.
- 2: 식사 1인분이 준비되어 식당 입구의 맨 앞에서 대기 중인 학생 1명이 식사를 시작한다.
식사 1인분이 준비될 때는 식당 입구에서 대기 중인 학생이 항상 존재한다. 식당 입구에 줄을 서서 대기하였으나 식사가 준비 안 된 학생은 식사를 못 한다.
입력
첫 번째 줄에 n이 주어진다.
다음 줄부터 n개의 줄에 걸쳐 한 줄에 하나의 정보가 주어진다. 주어지는 정보는 유형 1, 2중 하나이다.
출력
첫 번째 정보부터 n번째 정보까지 순서대로 처리한 다음, 식당 입구에 줄을 서서 대기하는 학생 수가 최대가 되었던 순간의 학생 수와 이때 식당 입구의 맨 뒤에 대기 중인 학생의 번호를 빈칸을 사이에 두고 순서대로 출력한다. 대기하는 학생 수가 최대인 경우가 여러 번이라면 맨 뒤에 줄 서 있는 학생의 번호가 가장 작은 경우를 출력한다.
제한
- 1 ≤ n ≤ 100,000
- A에는 유형 1, 유형 2만 저장되어 있다.
- 1 ≤ a ≤ n, 모든 양의 정수 a의 값은 서로 다르다.
나의코드
import java.io.*;
import java.util.*;
public class Main {
// 식당 입구 대기줄 - 26042번
public static void main(String[] args) throws IOException {
// 선입선출 - 큐
// 학셍이 학교에 도착하고 식사가 준비되는 n개의 정보가 저장된 A
// A에 저장된 첫번재 정보부터 n번째 순서대로 처리
// 식당 입구에 줄을 서서 대기하는 학생이 최대가 되었던 순간
// 학생의수, 식당 맨뒤에 대기중인 학생의 번호
// 대기중인 학생의 번호가 여러번이라면 가장 작은 경우 출력
// 1 a 학생번호가 양의 정수 a인 학생 1명이 맨뒤에 줄을 서기 시작 offer
// 2 식사 1인분이 준비되어 1명이 식사함 poll
// 1 -> offer /2 -> poll / a는 학생번호
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
// 최대 대기 인원수
int count = 0;
// 제일 작은 학생번호
int num = Integer.MAX_VALUE;
// 큐 선언
Queue<Integer> queue = new LinkedList<>();
for(int i = 0;i<N;i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int type = Integer.parseInt(st.nextToken());
if(type == 1){
// 추가된 학생번호
int studentNumber = Integer.parseInt(st.nextToken());
queue.offer(studentNumber);
// count가 더 작을경우 갱신해주기
if(queue.size() >= count) {
// 두개의 사이즈가 동일할 경우
if(queue.size() == count){
// 새로받은 학생 번호와 제일 작은 학생 번호 비교
if(num > studentNumber){
num = studentNumber;
}
}else {
count = queue.size();
num = studentNumber;
}
}
}else {
queue.poll();
}
}
br.close();
bw.write(count+" "+num);
bw.close();
}
}
'Algorithm > 코딩테스트' 카테고리의 다른 글
[코딩테스트] 백준 - 스카이라운 쉬운거 (0) | 2024.07.30 |
---|---|
[코딩테스트] 백준 - 파일합치기 (0) | 2024.07.30 |
[코딩테스트] 백준 - 세준세비 (0) | 2024.07.29 |
[코딩테스트] 백준 - 콘서트 (0) | 2024.07.29 |
[코딩테스트] 백준 - Yangjojang of The Year (0) | 2024.07.29 |