백준 22234 가희와 은행

노문택·2022년 4월 5일
0

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

골드5라는데..너무어렵다..ㅠ;;
다른사람 해답을 풀고 풀었다..

메인로직

  1. 자료구조를 Queue(이미 작업중)와 PriorityQueue(중도난입)로 분리

  2. 초마다 시뮬레이션을 해줌 (매초를 세줄 curtime , 현재 Queue의 작업 진행도를 알려줄 jobcount 변수선언 )

  3. 시뮬레이션 진행중 매초마다 Pq 에 중도난입 인원이있는지 확인하고 있으면 Queue 에 넣어줌

  4. 작업이 100% 진행도 체크 하고 100%였으면 Queue에서 하나 방출

  5. 작업이 100%가 아니지만 할당시간이 끝나면 Queue를 빼주고 남은시간만큼 Queue에넣어주고 진행

    // 4번과 5번 작업 할당시간이 끝낫기때문에 jobcount = 0으로 처리해줌

  6. 해당작업이 끝났다면 큐의 맨위 id를 출력해주고 시간(curtime)과 jobcount ++ 해주고 3번으로 이동 반복

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

class people implements Comparable<people>{
	int p;
	int t;
	int c;
	
	@Override
	public int compareTo(people o) {
		// TODO Auto-generated method stub
		return this.c-o.c;
	}
	public people(int p, int t, int c) {
		this.p = p;
		this.t = t;
		this.c = c;
	}
	
}


public class 가희와은행 {

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		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<people> q = new LinkedList<>();
		PriorityQueue<people> pq = new PriorityQueue<>();
		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 people(p,t,0));
		}
		int pc = Integer.parseInt(br.readLine());
		for(int i=0;i<pc;i++) {
			st = new StringTokenizer(br.readLine());
			int p = Integer.parseInt(st.nextToken());
			int t = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
			pq.add(new people(p,t,c));
		}
		StringBuilder sb = new StringBuilder();
		int curtime = 0;
		
		int jobcount=0;
		while(curtime<W) {
			
			int t = q.peek().t;
			int p = q.peek().p;
			
			// 은행에 도착햇는지 검사
			if(!pq.isEmpty()&&pq.peek().c==curtime) {
				q.add(pq.poll());
			}
			
			if(t-jobcount==0) { //작업이다끝나숴!!
				q.poll();
				jobcount=0;
			}
			else if(jobcount==T) { // 작업이 다안끝냇는데 할당시간이 끝난경우
				q.add(new people(p,(t-jobcount),0));
				q.poll();
				jobcount=0;
			}
			sb.append(q.peek().p).append("\n");
			curtime++;
			jobcount++;
		}
		System.out.println(sb);
		
	}

}

시뮬레이션 + Queue문제인데.. 골드5가맞나싶다.. 너무어려워..
ㅠㅠ 큐를 좀더 연습해봐야겠따 아직 능숙하지못한거같다.

profile
노력하는 뚠뚠이

0개의 댓글