๋ณธ๋ฌธ

๊ธฐ๋Šฅ๊ฐœ๋ฐœ #์Šคํƒ/ํ #level2

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

 

 

๐Ÿ’ก ์‹คํ–‰

import java.util.Arrays;

public class Run {
	public static void main(String[] args) {
		int[] inputs = { 93, 30, 55 };
		int[] speed = { 1, 30, 5 };

		// result: [2, 1]
		System.out.println(Arrays.toString(new FuncDevelopment().solution(inputs, speed)));
	}

}

 

๐Ÿ’ก ํ’€์ด


import java.util.ArrayList;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class FuncDevelopment {
	public int[] solution(int[] progresses, int[] speeds) {

		// Queue์— ๊ฐ ๊ธฐ๋Šฅ๊ฐœ๋ฐœ์— ๊ฑธ๋ฆฌ๋Š” ์ผ์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
		// progresses[i]๊ฐ€ speeds[i]์— ๋‚˜๋ˆ  ๋–จ์–ด์ง€๋ฉด ๋ชซ์„, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ชซ + 1์„ ์‚ฝ์ž…ํ•ด์ค€๋‹ค.
		Queue<Integer> queue = new ConcurrentLinkedQueue<>();
		for (int i = 0; i < progresses.length; i++) {
			queue.add(
				(100 - progresses[i]) % speeds[i] == 0 ? 
				(100 - progresses[i]) / speeds[i] : 
				(100 - progresses[i]) / speeds[i] + 1);
		}

		// queue: [7, 3, 9]
		System.out.println("queue: " + queue);
		
		// whlie๋ฌธ์ด ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— queue์—์„œ ์ฒซ๋ฒˆ์งธ์š”์†Œ๋ฅผ poll()ํ•ด์ค€๋‹ค.(๊ฐ€์žฅ ์ฒ˜์Œ ๊ฐœ๋ฐœ๋˜๊ธฐ ์‹œ์ž‘ํ•œ ๊ธฐ๋Šฅ)
		ArrayList<Integer> list = new ArrayList<>();
		int prevFunc = queue.poll();
		int numOfFuncs = 1;

		// ์ฒซ๋ฒˆ์งธ์˜ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ์— ๊ฑธ๋ฆฌ๋Š” ์ผ์ˆ˜๊ฐ€ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ผ์ˆ˜๋ณด๋‹ค ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด
		// ์ฒซ๋ฒˆ์งธ์˜ ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ•  ๋•Œ ๋‹ค์Œ ๊ธฐ๋Šฅ๋„ ๊ฐ™์ด ๋ฐฐํฌํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— numOfFuncs์˜ ๊ฐ’์„ 1์ฆ๊ฐ€ ์‹œํ‚จ๋‹ค.
		
		// ๋งŒ์•ฝ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด (์•ž์„  ๊ธฐ๋Šฅ๋ณด๋‹ค ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋ฉด)
		// ์•ž์„  ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ• ๋•Œ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ๋งŒ ๋ฐฐํฌํ•˜๊ธฐ ๋–„๋ฌธ์— numOfFuncs๋Š” 1์ด ๋œ๋‹ค.
		while (!queue.isEmpty()) {
			int curFunc = queue.poll();
			
			// prevFunc: 7, curFunc: 3
			// prevFunc: 7, curFunc: 9
			System.out.println("prevFunc: " + prevFunc + ", curFunc: " + curFunc);

			if (prevFunc >= curFunc) {
				numOfFuncs++;
			} else {
				list.add(numOfFuncs);
				numOfFuncs = 1;
				prevFunc = curFunc;
			}
		}
		
		list.add(numOfFuncs);
		int[] answer = new int[list.size()];
		for (int i = 0; i < list.size(); i++) {
			answer[i] = list.get(i);
		}
		return answer;
	}
}

 

 

P.S. ConcurrentLinkedQueue

์ž๋ฐ”์˜ java.util ์—์„œ ์ œ๊ณตํ•˜๋Š” Queue ํด๋ž˜์Šค๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ž„๊ณ„์˜์—ญ(critical section)์— ๋Œ€ํ•œ ๋™๊ธฐํ™”๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

 

๋ฌด์Šจ ๋ง์ด๋ƒ, 

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ํ•˜๋‚˜์˜ Queue ๊ฐ์ฒด์— ๋“ค์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๊ธฐ ์œ„ํ•ด queue.poll() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, ๋™์ผํ•œ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Queue์— [1, 2, 3]๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ์„ ๊ฒฝ์šฐ, ์Šค๋ ˆ๋“œ 3๊ฐœ๊ฐ€ critical section์—์„œ poll() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ ์Šค๋ ˆ๋“œ๋“ค์€ ๋ชจ๋‘ 1์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  Queue์—๋Š” [2, 3]๋งŒ ๋‚จ๊ฒŒ ๋œ๋‹ค. ํ๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ null์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ด์— ์šฐ๋ฆฌ๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ž๋ฐ”๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Queue๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ ์—ฌ๊ธฐ์—์„œ๋Š” ConcurrentLinkedQueue๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

ConcurrentLinkedQueue๋Š” ์ƒ์‚ฐ์ž-์†Œ๋น„์ž producer-consumer ๋ชจ๋ธ์—์„œ ์†Œ๋น„์ž๊ฐ€ ๋งŽ๊ณ  ์ƒ์‚ฐ์ž๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

Queue<Object> queue = new ConcurrentLinkedQueue<Object>();
queue.offer(data);  // put
queue.poll();       // get

 

 

๊ณต์œ 

๋Œ“๊ธ€

Cloud & AI Engineering | ์ž„์Šนํ•œ

design by tokiidesu. powerd by AXZ.