View

문제 링크:

https://programmers.co.kr/learn/courses/30/lessons/42586

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - κΈ°λŠ₯개발

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ μ€‘μž…λ‹ˆλ‹€. 각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ”

programmers.co.kr

 

풀이:

이 문제의 μš”μ μ€ μ•žμ— μžˆλŠ” κΈ°λŠ₯이 λ°°ν¬λ˜μ–΄μ•Ό λ‹€μŒ κΈ°λŠ₯이 배포될 수 μžˆλ‹€λŠ” 것이닀.QueueλŠ” λ¨Όμ € 넣은 데이터가 λ¨Όμ € λ‚˜μ˜€λŠ” FIFO(First In First Out) νŠΉμ§•μ„ 가지고 μžˆμœΌλ―€λ‘œ 문제 해결에 μ°Έκ³ ν–ˆλ‹€.

	// μž‘μ—… μ™„λ£Œν•˜λŠ” 데에 κ±Έλ¦¬λŠ” μ‹œκ°„ 계산: (100 - μž‘μ—… 진도) / μž‘μ—… 속도
	for (int i = 0; i < progresses.length; i++) {
		int time = (100 - progresses[i]) / speeds[i];

		// λ‚˜λ¨Έμ§€κ°€ 있으면 일수 + 1
		if ((100 - progresses[i]) % speeds[i] != 0) {
			time++;
		}
		worktime.add(time);
	}

λ¨Όμ € (100 - μž‘μ—… 진도) / μž‘μ—… 속도λ₯Ό κ±Έλ¦¬λŠ” 일수둜 작고 λ‚˜λ¨Έμ§€κ°€ μžˆμ„ κ²½μš°μ— ν•˜λ£¨λ₯Ό λ”ν•˜λŠ” κ²ƒμœΌλ‘œ μž‘μ—…μ„ μ™„λ£Œν•˜λŠ” 데에 κ±Έλ¦¬λŠ” 일수λ₯Ό μ €μž₯ν•˜λŠ” List에 λ„£μ–΄ μ€€λ‹€.

 

	public List<Integer> calcNextWork(Queue<Integer> worktime) {
		List<Integer> result = new ArrayList<Integer>();

		// prevWork: 비ꡐ할 λ•Œ 기쀀이 λ˜λŠ” 일수
		int prevWork = worktime.poll();
		int cnt = 1;

		while (!worktime.isEmpty()) {
			int nextWork = worktime.peek();

			if (prevWork < nextWork) {
				result.add(cnt);
				cnt = 1;

				prevWork = worktime.poll();

			} else {
				worktime.poll();
				cnt++;
			}
		}
		result.add(cnt);

		return result;
	}

κ°€μž₯ 처음 일수λ₯Ό prevWork둜 μ €μž₯ν•˜κ³  λ‹€μŒμ— μ˜€λŠ” μΌμˆ˜μ™€ λΉ„κ΅ν•˜μ—¬ μž‘μœΌλ©΄ κ²°κ³Ό list에 λ„£μ–΄ μ£Όκ³ 

μ•„λ‹ˆλ©΄, κ·Έ λ‹€μŒμ˜ 일수λ₯Ό κΊΌλ‚΄μ„œ preWork보닀 μž‘μ€ 값이 λ‚˜μ˜¬ λ•ŒκΉŒμ§€ λΉ„κ΅ν•œλ‹€. 

 

μ†ŒμŠ€ μ½”λ“œ:

Share Link
reply
Β«   2025/01   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31