백준 22234번 - 가희와 은행

박진형·2021년 9월 5일
0

algorithm

목록 보기
90/111
post-custom-banner

문제 풀이

0부터 W-1초까지 은행 직원이 어떤 손님을 담당하고 있는지 출력하는 문제.
먼저 0초에 대기중인 N명의 손님들을 큐에 넣어주고, 1초 이후로 오게될 손님들은 해시맵을 이용해서 몇초에 어떤 손님이 들어올지 저장하게 했다. 굳이 이렇게 해시맵을 사용할 필요 없이 들어오는 시간을 기준으로 오름차순으로 정렬을 해서 미리 큐에 넣어놔도 될듯하다.

이제 세팅이 완료가 되었으면 0부터 W-1초까지 시뮬레이션을 돌리면 된다.
해시맵을 통해 만약에 i초에 들어올 손님이 있다면 큐에 넣어주고, 별도의 변수 cnt를 이용해서 은행 직원이 현재 손님을 몇초동안 업무 처리를 해주고 있는지 확인한다.
만약에 은행직원이 현재 손님의 업무를 모두 처리했다면 (t - cnt == 0) 업무 처리를 다 했으므로 cnt = 0으로 바꿔주면서 큐에서 빼내준다.

(나는 이부분에서 cnt를 0으로 초기화 해주는 작업을 빼먹어서 틀렸었다.)
만약에 은행 직원이 한번에 처리해줄 수 있는 시간을 다 썼다면(cnt == T), 이 손님을 큐의 맨뒤로 넣어준다. 마찬가지로 cnt를 0으로 초기화해준다.

그러면서 큐의 맨앞에 어떤 손님이있는지 출력해주면된다.

문제 링크

boj/22234

소스코드

PS/22234.java

import java.io.*;
    import java.util.*;


    public class Main {
        static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        static class Person
        {
            int p,t;

            public void setT(int t) {
                this.t = t;
            }

            public Person(int p, int t) {
                this.p = p;
                this.t = t;
            }
        }

        public static void main(String[] args) throws IOException {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int T = Integer.parseInt(st.nextToken());
            int W = Integer.parseInt(st.nextToken());
            Queue<Person> q= new LinkedList<>();
            HashMap<Integer, Person> map = new HashMap<>();
            for(int i=0;i<N;i++)
            {
                st = new StringTokenizer(br.readLine());
                int p = Integer.parseInt(st.nextToken());
                int t = Integer.parseInt(st.nextToken());
                q.add(new Person(p, t));
            }
            int m = Integer.parseInt(br.readLine());
            for(int i=0;i<m;i++)
            {
                st = new StringTokenizer(br.readLine());
                int p = Integer.parseInt(st.nextToken());
                int t = Integer.parseInt(st.nextToken());
                int c = Integer.parseInt(st.nextToken());
                map.put(c, new Person(p, t));
            }
            int cnt = 0;


            for(int i=0;i<W;i++)
            {
                int t = q.peek().t;
                int p = q.peek().p;
                if(map.containsKey(i))
                {
                    q.add(map.get(i));
                }
                if(t-cnt ==0) {
                    q.poll();
                    cnt =0;
                }
                else if(cnt == T)
                {
                    q.add(new Person(p,t-cnt));
                    q.poll();
                    cnt = 0;
                }
                bw.write(Integer.toString(q.peek().p)+"\n");

                cnt++;
            }
            bw.flush();
        }

    }
post-custom-banner

0개의 댓글