Algorithm/문제 풀이 / / 2022. 11. 23. 19:00

[BAEKJOON_26043 - JAVA] 식당 메뉴

반응형

 

문제

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

 

26043번: 식당 메뉴

첫 번째 1 2 1을 처리한 후, 대기 줄은 (2 1)이 된다. (2 1)에서 2는 학생 번호, 1은 좋아하는 메뉴 번호를 나타낸다. 두 번째 1 1 1을 처리한 후, 대기 줄은 (2 1) (1 1)이 된다. (1 1)에서 앞쪽 1은 학생 번호

www.acmicpc.net

 

JAVA코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    private final static String NONE = "None";

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        /**
         * 본인이 좋아하는 메뉴를 먹은 학생 목록 A
         * 본인이 좋아하지 않는 메뉴를 먹은 학생 목록 B
         * 학교 식당에 도착하였으나 식사를 하지 못한 학생 목록 C
         */

        List<Integer> listA = new ArrayList<>();
        List<Integer> listB = new ArrayList<>();
        List<Integer> listC = new ArrayList<>();
        
        /*
         * 1 a b: 학생 번호가 양의 정수 a이고 좋아하는 메뉴 번호가 양의 정수 b인 학생 1명이 학교 식당에 도착하여 식당 입구의 맨 뒤에 줄을 서기 시작한다.
         * 2 b: 메뉴 번호가 양의 정수 b인 식사 1인분이 준비되어 식당 입구의 맨 앞에서 대기 중인 학생 1명이 식사를 시작한다.
         */

        int n = Integer.parseInt(br.readLine());
        Queue<Student> waiting = new LinkedList<>();

        for (int idx = 0; idx < n; idx++) {
            st = new StringTokenizer(br.readLine());
            int category = Integer.parseInt(st.nextToken());

            // 학생인 경우
            if (category == 1) {
                waiting.add(new Student(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
            } else {
                // 메뉴인 경우
                Student student = waiting.poll();
                int menu = Integer.parseInt(st.nextToken());

                if (student.getFavoriteMenu() == menu) {
                    // 본인이 좋아하는 메뉴를 먹은 학생 목록 A
                    listA.add(student.getId());
                } else {
                    // 본인이 좋아하지 않는 메뉴를 먹은 학생 목록 B                   
                    listB.add(student.getId());
                }
            }
        }

        // 식사를 하지 못한 학생 목록
        while(!waiting.isEmpty()) {
            Student student = waiting.poll();
            listC.add(student.getId());
        }

        bw.write(listA.isEmpty() ? NONE : printList(listA));
        bw.newLine();
        bw.write(listB.isEmpty() ? NONE : printList(listB));
        bw.newLine();
        bw.write(listC.isEmpty() ? NONE : printList(listC));

        br.close();
        bw.flush();
        bw.close();

    }

    private static String printList(List<Integer> list) {
        StringBuilder sb = new StringBuilder();
        Collections.sort(list);
        list.forEach(id -> {
            sb.append(id);
            sb.append(" ");
        });

        return sb.toString().trim();
    }

    public static class Student{
        int id;
        int favoriteMenu;
     
        public Student(int id, int favoriteMenu) {
            this.id = id;
            this.favoriteMenu = favoriteMenu;
        }

        public int getId() {
            return id;
        }

        public int getFavoriteMenu() {
            return favoriteMenu;
        }
        
    }

}
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유