Programmers #42

์ด๊ฐ•์šฉยท2023๋…„ 10์›” 18์ผ
0

Programmers

๋ชฉ๋ก ๋ณด๊ธฐ
41/58

ํƒ๋ฐฐ์ƒ์ž

๐Ÿ“‘ ๋ฌธ1) ์˜์žฌ๋Š” ํƒ๋ฐฐ์ƒ์ž๋ฅผ ํŠธ๋Ÿญ์— ์‹ฃ๋Š” ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค. ์˜์žฌ๊ฐ€ ์‹ค์–ด์•ผ ํ•˜๋Š” ํƒ๋ฐฐ์ƒ์ž๋Š” ํฌ๊ธฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ™์œผ๋ฉฐ 1๋ฒˆ ์ƒ์ž๋ถ€ํ„ฐ n๋ฒˆ ์ƒ์ž๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์— ์ผ๋ ฌ๋กœ ๋†“์—ฌ ์˜์žฌ์—๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ๋Š” ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ง„ํ–‰์ด ๊ฐ€๋Šฅํ•ด์„œ ๋ฒจํŠธ์— ๋†“์ธ ์ˆœ์„œ๋Œ€๋กœ(1๋ฒˆ ์ƒ์ž๋ถ€ํ„ฐ) ์ƒ์ž๋ฅผ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์— ๋†“์ธ ์ˆœ์„œ๋Œ€๋กœ ํƒ๋ฐฐ์ƒ์ž๋ฅผ ๋‚ด๋ ค ๋ฐ”๋กœ ํŠธ๋Ÿญ์— ์‹ฃ๊ฒŒ ๋˜๋ฉด ํƒ๋ฐฐ ๊ธฐ์‚ฌ๋‹˜์ด ๋ฐฐ๋‹ฌํ•˜๋Š” ์ˆœ์„œ์™€ ํƒ๋ฐฐ์ƒ์ž๊ฐ€ ์‹ค๋ ค ์žˆ๋Š” ์ˆœ์„œ๊ฐ€ ๋งž์ง€ ์•Š์•„ ๋ฐฐ๋‹ฌ์— ์ฐจ์งˆ์ด ์ƒ๊น๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํƒ๋ฐฐ ๊ธฐ์‚ฌ๋‹˜์ด ๋ฏธ๋ฆฌ ์•Œ๋ ค์ค€ ์ˆœ์„œ์— ๋งž๊ฒŒ ์˜์žฌ๊ฐ€ ํƒ๋ฐฐ์ƒ์ž๋ฅผ ์‹ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์˜ ๋งจ ์•ž์— ๋†“์ธ ์ƒ์ž๊ฐ€ ํ˜„์žฌ ํŠธ๋Ÿญ์— ์‹ค์–ด์•ผ ํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ ์ƒ์ž๋ฅผ ํŠธ๋Ÿญ์— ์‹ค์„ ์ˆœ์„œ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์ž ์‹œ ๋‹ค๋ฅธ ๊ณณ์— ๋ณด๊ด€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณ ๊ฐ์˜ ๋ฌผ๊ฑด์„ ํ•จ๋ถ€๋กœ ๋•…์— ๋‘˜ ์ˆ˜ ์—†์–ด ๋ณด์กฐ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณด์กฐ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ๋Š” ์•ž ๋’ค๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ž…๊ตฌ ์™ธ์— ๋‹ค๋ฅธ ๋ฉด์ด ๋ง‰ํ˜€ ์žˆ์–ด์„œ ๋งจ ์•ž์˜ ์ƒ์ž๋งŒ ๋บ„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฆ‰, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋ณด์กฐ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์— ๋ณด๊ด€ํ•œ ์ƒ์ž๋ถ€ํ„ฐ ๊บผ๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค). ๋ณด์กฐ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ๋ฅผ ์ด์šฉํ•ด๋„ ๊ธฐ์‚ฌ๋‹˜์ด ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ƒ์ž๋ฅผ ์‹ฃ์ง€ ๋ชป ํ•œ๋‹ค๋ฉด, ๋” ์ด์ƒ ์ƒ์ž๋ฅผ ์‹ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์˜์žฌ๊ฐ€ 5๊ฐœ์˜ ์ƒ์ž๋ฅผ ์‹ค์–ด์•ผ ํ•˜๋ฉฐ, ํƒ๋ฐฐ ๊ธฐ์‚ฌ๋‹˜์ด ์•Œ๋ ค์ค€ ์ˆœ์„œ๊ฐ€ ๊ธฐ์กด์˜ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์— ๋„ค ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ, ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ, ๋‹ค์„ฏ ๋ฒˆ์งธ ๋†“์ธ ํƒ๋ฐฐ์ƒ์ž ์ˆœ์„œ์ธ ๊ฒฝ์šฐ, ์˜์žฌ๋Š” ์šฐ์„  ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ ์ƒ์ž๋ฅผ ๋ณด์กฐ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ ๋„ค ๋ฒˆ์งธ ์ƒ์ž๋ฅผ ํŠธ๋Ÿญ์— ์‹ฃ๊ณ  ๋ณด์กฐ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์—์„œ ์„ธ ๋ฒˆ์งธ ์ƒ์ž ๋นผ์„œ ํŠธ๋Ÿญ์—์‹ฃ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ์ƒ์ž๋ฅผ ์‹ค์–ด์•ผ ํ•˜์ง€๋งŒ ๋ณด์กฐ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์—์„œ๋Š” ๋‘ ๋ฒˆ์งธ ์ƒ์ž๋ฅผ, ๊ธฐ์กด์˜ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์—๋Š” ๋‹ค์„ฏ ๋ฒˆ์งธ ์ƒ์ž๋ฅผ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”์ด์ƒ์˜ ์ƒ์ž๋Š” ์‹ค์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠธ๋Ÿญ์—๋Š” 2๊ฐœ์˜ ์ƒ์ž๋งŒ ์‹ค๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํƒ๋ฐฐ ๊ธฐ์‚ฌ๋‹˜์ด ์›ํ•˜๋Š” ์ƒ์ž ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด order๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์˜์žฌ๊ฐ€ ๋ช‡ ๊ฐœ์˜ ์ƒ์ž๋ฅผ ์‹ค์„ ์ˆ˜ ์žˆ๋Š”์ง€ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.


์ œํ•œ์‚ฌํ•ญ

  • 1 โ‰ค order์˜ ๊ธธ์ด โ‰ค 1,000,000
  • order๋Š” 1์ด์ƒ order์˜ ๊ธธ์ด ์ดํ•˜์˜ ๋ชจ๋“  ์ •์ˆ˜๊ฐ€ ํ•œ๋ฒˆ์”ฉ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • order[i]๋Š” ๊ธฐ์กด์˜ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์— order[i]๋ฒˆ์งธ ์ƒ์ž๋ฅผ i+1๋ฒˆ์งธ๋กœ ํŠธ๋Ÿญ์— ์‹ค์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

orderresult
[4,3,1,2,5]2
[5,4,3,2,1]5

๋‚˜์˜ ํ’€์ด

package programmers;

import java.util.Stack;

public class DeliveryBox {
	
	public static int solution(int[] order) {
		
		
		int idx = 0;
		Stack<Integer> stack = new Stack<>();
		
		for(int i = 0; i < order.length; i++) {
			stack.push(i+1);
			while(!stack.isEmpty()) {
				if(stack.peek() == order[idx]) {
					stack.pop();
					idx++;
				}else break;
			}
		}
		System.out.println(idx);
		return idx;
		
    }
	
	public static void main(String[] args) {
		int[] order = {1,3,5,7,9,2,4,6,8,10};
		solution(order);
	}

}



๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ

๐Ÿ“‘ ๋ฌธ2) ํŠธ๋Ÿญ ์—ฌ๋Ÿฌ ๋Œ€๊ฐ€ ๊ฐ•์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ์ผ์ฐจ์„  ๋‹ค๋ฆฌ๋ฅผ ์ •ํ•ด์ง„ ์ˆœ์œผ๋กœ ๊ฑด๋„ˆ๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋ ค๋ฉด ์ตœ์†Œ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฆฌ์—๋Š” ํŠธ๋Ÿญ์ด ์ตœ๋Œ€ bridge_length๋Œ€ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฆฌ๋Š” weight ์ดํ•˜๊นŒ์ง€์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ๋‹ค๋ฆฌ์— ์™„์ „ํžˆ ์˜ค๋ฅด์ง€ ์•Š์€ ํŠธ๋Ÿญ์˜ ๋ฌด๊ฒŒ๋Š” ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํŠธ๋Ÿญ 2๋Œ€๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๊ณ  ๋ฌด๊ฒŒ๋ฅผ 10kg๊นŒ์ง€ ๊ฒฌ๋””๋Š” ๋‹ค๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ [7, 4, 5, 6]kg์ธ ํŠธ๋Ÿญ์ด ์ˆœ์„œ๋Œ€๋กœ ์ตœ๋‹จ ์‹œ๊ฐ„ ์•ˆ์— ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฑด๋„ˆ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๊ณผ ์‹œ๊ฐ„๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚œ ํŠธ๋Ÿญ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋Š” ํŠธ๋Ÿญ๋Œ€๊ธฐ ํŠธ๋Ÿญ
0[][][7,4,5,6]
1~2[][7][4,5,6]
3[7][4][5,6]
4[7][4,5][6]
5[7,4][5][6]
6~7[7,4,5][6][]
8[7,4,5,6][][]

๋”ฐ๋ผ์„œ, ๋ชจ๋“  ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋ ค๋ฉด ์ตœ์†Œ 8์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

solution ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋‹ค๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํŠธ๋Ÿญ ์ˆ˜ bridge_length, ๋‹ค๋ฆฌ๊ฐ€ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ weight, ํŠธ๋Ÿญ ๋ณ„ ๋ฌด๊ฒŒ truck_weights๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋•Œ ๋ชจ๋“  ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋ ค๋ฉด ์ตœ์†Œ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.


์ œํ•œ ์กฐ๊ฑด

  • bridge_length๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • weight๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • truck_weights์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ํŠธ๋Ÿญ์˜ ๋ฌด๊ฒŒ๋Š” 1 ์ด์ƒ weight ์ดํ•˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

bridge_lengthweighttruck_weightsreturn
210[7,4,5,6]8
100100[10]101
100100[10,10,10,10,10,10,10,10,10,10]110

๋‚˜์˜ ํ’€์ด

package programmers;

import java.util.LinkedList;
import java.util.Queue;

public class PassingOverTheBridge {
	
	public static int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        Queue<Integer> queue = new LinkedList<>();
        Queue<Integer> bridge = new LinkedList<>();
        
        for(int truck_weight : truck_weights) {
        	queue.add(truck_weight);
        }
        
        int currentWeightOnBridge = 0;
        
        for(int i = 0; i < bridge_length; i++) {
        	bridge.add(0);
        }
        
        
        
        while(!queue.isEmpty() || currentWeightOnBridge > 0) {
        	answer++;
        	
        	currentWeightOnBridge -= bridge.poll();
        	
        	if(!queue.isEmpty() && currentWeightOnBridge + queue.peek() <= weight) {
        		int nextTruckWeight = queue.poll();
        		bridge.add(nextTruckWeight);
        		currentWeightOnBridge += nextTruckWeight;
        		
        	}else {
        		bridge.add(0);
        	}
        	
        
        }
        
       	
        return answer;
    }
	
	
	public static void main(String[] args) {
		int[] truck_weights = {7,4,5,6};
		solution(2, 10, truck_weights);
	}

}



๋‚˜์˜ ์ƒ๊ฐ

๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋ฉด์„œ ์ œ์ผ ์ฒ˜์Œ ํ•œ ์ƒ๊ฐ์€ ๋‹ค๋ฆฌ๊ธธ์ด๋ฅผ ๋ฐฐ์—ด ๋˜๋Š” ์ˆœ์„œ๋กœ ์ €์žฅํ•˜๋ฉด ๋˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜์˜€๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ๋‹ค๋ฆฌ ๊ธธ์ด๊ฐ€ 2๋ผ๋Š” ๊ฒƒ์€ ๋ฒ„์Šคํ•œ๋Œ€๊ฐ€ ๋‹ค๋ฆฌ ๊ธธ์ด๋ฅผ ํ†ต๊ณผํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด 2์ดˆ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ด๊ฑฐ์‹์„ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

[0,0] // ๋‹ค๋ฆฌ์˜ ์ดˆ๊ธฐ์ƒํƒœ
---------------------
[0,7] // ๋ฌด๊ฒŒ 7์งœ๋ฆฌ ๋ฒ„์Šค๊ฐ€ ๋‹ค๋ฆฌ ์ดˆ์ž…์„ ํ†ต๊ณผํ•œ ์ƒํƒœ
[7,0] // ๋ฌด๊ฒŒ 7์งœ๋ฆฌ ๋ฒ„์Šค๊ฐ€ ๋‹ค๋ฆฌ ๋์— ์„  ์ƒํƒœ
[0,4] // ๋ฌด๊ฒŒ 4์งœ๋ฆฌ ๋ฒ„์Šค๊ฐ€ ๋‹ค๋ฆฌ ์ดˆ์ž…์„ ํ†ต๊ณผํ•œ ์ƒํƒœ
[4,5] // ๋‘ ๋ฒ„์Šค์˜ ๋ฌด๊ฒŒ๊ฐ€ 10์„ ๋„˜์ง€์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๊ฒŒ 4,5 ๋ฒ„์Šค๊ฐ€ ๋‹ค๋ฆฌ ์œ„์— ์„  ์ƒํƒœ
[5,0] // ๋ฌด๊ฒŒ 5์งœ๋ฆฌ ๋ฒ„์Šค๊ฐ€ ๋‹ค๋ฆฌ ๋์— ์„  ์ƒํƒœ
[0,6] // ๋ฌด๊ฒŒ 6์งœ๋ฆฌ ๋ฒ„์Šค๊ฐ€ ๋‹ค๋ฆฌ ์ดˆ์ž…์„ ํ†ต๊ณผํ•œ ์ƒํƒœ
[6,0] // ๋ฌด๊ฒŒ 6์งœ๋ฆฌ ๋ฒ„์Šค๊ฐ€ ๋‹ค๋ฆฌ ๋์— ์„  ์ƒํƒœ
[0,0] // ๋ชจ๋“  ๋ฒ„์Šค๊ฐ€ ๋‹ค๋ฆฌ๋ฅผ ํ†ต๊ณผํ•œ ์ƒํƒœ 

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ๋ณด๋‹ˆ int[] ๋ฐฐ์—ด๋ณด๋‹จ Queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ FIFO ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ์˜ ๊ฐ’๋“ค์„ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜์˜€๋‹ค.

 Queue<Integer> queue = new LinkedList<>();
 Queue<Integer> bridge = new LinkedList<>();
        
 for(int truck_weight : truck_weights) {
 	queue.add(truck_weight);
 }

ํ˜„์žฌ ๋Œ€๊ธฐ์ค‘์ธ ๋ฒ„์Šค ์ƒํƒœ

๊ทธ๋ฆฌ๊ณ , ๋‹ค๋ฆฌ ์œ„์— ์„  ๋ฒ„์Šค๋“ค์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ณ€์ˆ˜ currentWeightOnBridge๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ดˆ๊ธฐ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

int currentWeightOnBridge = 0;
        
for(int i = 0; i < bridge_length; i++) {
	bridge.add(0);
}

ํ•ต์‹ฌ ๋กœ์ง์„ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

while(!queue.isEmpty() || currentWeightOnBridge > 0) {
	answer++;
        	
    currentWeightOnBridge -= bridge.poll();
        	
    if(!queue.isEmpty() && currentWeightOnBridge + queue.peek() <= weight) {
    	int nextTruckWeight = queue.poll();
        bridge.add(nextTruckWeight);
        currentWeightOnBridge += nextTruckWeight;
        		
    }else {
    	bridge.add(0);
    }
        	
        
}


1. Loop ์กฐ๊ฑด : queue๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๊ฑฐ๋‚˜(! queue.isEmpty()) ๋‹ค๋ฆฌ ์œ„์˜ ํ˜„์žฌ ๋ฌด๊ฒŒ (currentWeightOnBridge)๊ฐ€ 0๋ณด๋‹ค ํฐ ๋™์•ˆ ๋ฃจํ”„๋ฅผ ๊ณ„์† ์‹คํ–‰
- queue : ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋Ÿญ๋“ค์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋‹ด๊ธด ํ
- currentWeightOnBridge : ๋‹ค๋ฆฌ ์œ„์˜ ํ˜„์žฌ ํŠธ๋Ÿญ๋“ค์˜ ๋ฌด๊ฒŒ ํ•ฉ

2. Time Update : answer++;๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ„์„ 1์”ฉ ์ฆ๊ฐ€

3. Move Truck out of the Bridge

- bridge.poll() : ๋‹ค๋ฆฌ ์œ„ ์ฒซ ๋ฒˆ์งธ ํŠธ๋Ÿญ(๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ํŠธ๋Ÿญ)์„ ๋‹ค๋ฆฌ์—์„œ ๋นผ๋‚ด๊ณ 
- currentWeightOnBridge -= bridge.poll() : ๊ทธ ํŠธ๋Ÿญ์˜ ๋ฌด๊ฒŒ๋ฅผ 
- currentWeightOnBridge์—์„œ ๋บ€๋‹ค.

4. Check and Move New Truck onto the Bridge

- if(!queue.isEmpty() && currentWeightOnBridge + queue.peek() <= weight): ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋Ÿญ์ด ์žˆ๊ณ , ๊ทธ ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋„ ๋‹ค๋ฆฌ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ(weight)๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š์œผ๋ฉด,

- queue.poll(): ๋Œ€๊ธฐ ํŠธ๋Ÿญ์—์„œ ํ•˜๋‚˜๋ฅผ ๋นผ๋‚ด์–ด(nextTruckWeight๋กœ)
- bridge.add(nextTruckWeight): ๋‹ค๋ฆฌ ์œ„์— ์˜ฌ๋ฆฌ๊ณ ,
- currentWeightOnBridge += nextTruckWeight: ๋‹ค๋ฆฌ ์œ„์˜ ํ˜„์žฌ ๋ฌด๊ฒŒ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
- else: ๋งŒ์•ฝ ์ƒˆ ํŠธ๋Ÿญ์ด ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด,
- bridge.add(0): ๋‹ค๋ฆฌ ์œ„์— 0์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠธ๋Ÿญ์ด ์—†์Œ์„ ํ‘œํ˜„ํ•œ๋‹ค.

5. ์œ„ ๋‹จ๊ณ„๋“ค์„ ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ํ˜น์€ ๋‹ค๋ฆฌ ์œ„์˜ ํŠธ๋Ÿญ ๋ฌด๊ฒŒ๊ฐ€ 0์ด ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณตํ•œ๋‹ค.

๊ฐ€์žฅ ํฐ ์ˆ˜

๐Ÿ“‘ ๋ฌธ3) 0 ๋˜๋Š” ์–‘์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ •์ˆ˜๋ฅผ ์ด์–ด ๋ถ™์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ์•Œ์•„๋‚ด ์ฃผ์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ์–ด์ง„ ์ •์ˆ˜๊ฐ€ [6, 10, 2]๋ผ๋ฉด [6102, 6210, 1062, 1026, 2610, 2106]๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด์ค‘ ๊ฐ€์žฅ ํฐ ์ˆ˜๋Š” 6210์ž…๋‹ˆ๋‹ค.

0 ๋˜๋Š” ์–‘์˜ ์ •์ˆ˜๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด numbers๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ˆœ์„œ๋ฅผ ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ์–ด return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.


์ œํ•œ ์‚ฌํ•ญ

  • numbers์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 100,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • numbers์˜ ์›์†Œ๋Š” 0 ์ด์ƒ 1,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ์ •๋‹ต์ด ๋„ˆ๋ฌด ํด ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ์–ด return ํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

numberreturn
[6,10,2]"6210"
[3,30,34,5,9]"9534330"

๋‚˜์˜ ํ’€์ด

package programmers;

import java.util.Arrays;

public class BiggestNumber {
	
	public static String solution(int[] numbers) {
       
		
		String[] strNumbers = new String[numbers.length];
		
		for(int i = 0; i < numbers.length; i++) {
			strNumbers[i] = String.valueOf(numbers[i]);
		}
		Arrays.sort(strNumbers, (o1, o2) -> (o2 + o1).compareTo(o1+o2));
		
		if(strNumbers[0].equals("0")) {
			return "0";
		}
        
        return String.join("", strNumbers);
    }
	
	public static void main(String[] args) {
		int[] numbers = {3, 30, 34, 5, 9};
		solution(numbers);
	}

}

๋‚˜์˜ ์ƒ๊ฐ

  • ์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์„œ๋กœ ํ•ฉ์น˜๊ณ  ๋น„๊ตํ•˜๋ฉด, ์ž๋ฆฟ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์ˆซ์ž๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Œ


(o1, o2) -> (o2 + o1).compareTo(o1 + o2)
์ด ๋น„๊ต ํ•จ์ˆ˜๋Š” ๋‘ ๋ฌธ์ž์—ด o1๊ณผ o2๋ฅผ ์—ฐ๊ฒฐํ•œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• 
(o2 + o1 ๊ณผ o1 + o2)์„ ๋น„๊ตํ•˜์—ฌ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ
์˜ˆ๋ฅผ ๋“ค์–ด o1 = "3" ์ด๊ณ  o2 = "30"์ด๋ผ๋ฉด 
"303","330"์„ ๋น„๊ตํ•˜๊ฒŒ ๋˜๊ณ , ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์ด ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž์—ด๋ณด๋‹ค 
์‚ฌ์ „์ ์œผ๋กœ ์•ž์„ ๋‹ค๋ฉด ์Œ์ˆ˜๋ฅผ, ๋’ค๋”ฐ๋ผ ์˜จ๋‹ค๋ฉด ์–‘์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
์–‘์ˆ˜๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์€ ๊ฒฝ์šฐ, ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ o2๊ฐ€ o1๋ณด๋‹ค ๋จผ์ € ์˜ค๋„๋ก ๋ฐฐ์—ด์„ ์ •๋ ฌ

์†Œ์ˆ˜ ์ฐพ๊ธฐ

๐Ÿ“‘ ๋ฌธ4) ํ•œ์ž๋ฆฌ ์ˆซ์ž๊ฐ€ ์ ํžŒ ์ข…์ด ์กฐ๊ฐ์ด ํฉ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ํฉ์–ด์ง„ ์ข…์ด ์กฐ๊ฐ์„ ๋ถ™์—ฌ ์†Œ์ˆ˜๋ฅผ ๋ช‡ ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์ข…์ด ์กฐ๊ฐ์— ์ ํžŒ ์ˆซ์ž๊ฐ€ ์ ํžŒ ๋ฌธ์ž์—ด numbers๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ข…์ด ์กฐ๊ฐ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์†Œ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.


์ œํ•œ์‚ฌํ•ญ

  • numbers๋Š” ๊ธธ์ด 1 ์ด์ƒ 7 ์ดํ•˜์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • numbers๋Š” 0~9๊นŒ์ง€ ์ˆซ์ž๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • "013"์€ 0, 1, 3 ์ˆซ์ž๊ฐ€ ์ ํžŒ ์ข…์ด ์กฐ๊ฐ์ด ํฉ์–ด์ ธ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

numbersreturn
"17"3
"011"2

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์˜ˆ์ œ #1

  • [1, 7]์œผ๋กœ๋Š” ์†Œ์ˆ˜ [7, 17, 71]๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ #2

  • [0, 1, 1]์œผ๋กœ๋Š” ์†Œ์ˆ˜ [11, 101]๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์˜ ํ’€์ด

package programmers;

import java.util.LinkedHashSet;
import java.util.Set;

public class FindPrimeNum2 {
	
	
	
	static Set<String> set = new LinkedHashSet <>();
	
	
	
	public static void dfs(String prefix, String remaining) {
		
		if(!prefix.isEmpty()) {
			set.add(Integer.toString(Integer.parseInt(prefix)));
		}
		System.out.println(set);
		if(remaining.isEmpty()) {
			return;
		}
		
		for(int i = 0; i < remaining.length(); i++) {
			
			dfs(prefix + remaining.charAt(i), remaining.substring(0,i) + remaining.substring(i+1));
		}
	}
	
	public static int solution(String numbers) {
        int answer = 0;
        
        dfs("", numbers);
        
        for(String numStr : set) {
        	int num = Integer.parseInt(numStr);
        	if(isPrime(num)) {
        		answer++;
        	}
        }
        
        
        return answer;
    }

	public static boolean isPrime(int n) {
		if(n < 2) return false;
		
		for(int i = 2; i <= Math.sqrt(n); i++) {
			if(n % i == 0) return false;
		}
		
		return true;
	}
    
	
	
	
	public static void main(String[] args) {
		String numbers = "011";
		solution(numbers);
	}

}

๋‚˜์˜ ์ƒ๊ฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ๋ฌธํ„ฑ์— ํ„ฑํ•˜๊ณ  ๊ฑธ๋ฆฌ๋Š” ๋А๋‚Œ์ด ๋“œ๋Š” ๋ฌธ์ œ๊ฐ€ DFS, BFS๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋งค๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ "๋‹ค์Œ์— ๋‚˜์˜ค๋ฉด ๋‹ค์‹œ ํ’€์ง€ ๋ญ...." ํ•˜๊ณ  ์ง€๋‚˜์ณค๋Š”๋ฐ, ์˜ค๋Š˜์€ ๊ธฐํ•„์ฝ” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ด๋ฅผ ํ•˜๊ธฐ์œ„ํ•ด ํ•˜๋ฃจ ์ข…์ผ ์ด ๋ฌธ์ œ๋ฅผ ์žก๊ณ  ์žˆ์—ˆ๋‹ค. ์ด๊ฑธ ์™œ ํ•˜๋ฃจ ์ข…์ผ ์žก๊ณ  ์žˆ๋ƒ๋Š” ๋ถ„๋“ค๋„ ๊ณ„์‹œ๊ฒ ์ง€๋งŒ, ๋‚˜๋กœ์„œ๋Š” ์ด๊ฒƒ์„ ์ดํ•ด ๋ชปํ•˜๋ฉด ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์ด๋‹ค. ์ง€๊ธˆ ์ด ๋ฌธ์ œ์˜ ํ’€์ด๋Š” ๋‚˜์˜ ๋จธ๋ฆฟ์†์—์„œ 100% ๋‚˜์˜จ ๋‹ต์€ ์•„๋‹ˆ์ง€๋งŒ (feat.chatGPT) ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๊ฒƒ์„ ํ•œ๋ฒˆ ๋” ๊ธฐ๋กํ•จ์œผ๋กœ์จ ๋‹ค์Œ์— ์ด์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค๋ฉด ๊ผญ ๋‚˜์˜ ํž˜์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ฒ ๋‹ค.

dfs("", "011")

  • i = 0 dfs("0", "11")
    • i = 0 dfs("01", "1")
      • i = 0; dfs("011","") -> ์ข…๋ฃŒ (ํ•˜์œ„ ํ˜ธ์ถœ ์—†์Œ)
    • i = 1 dfs("01", "1") -> ์ด๋ฏธ ํ˜ธ์ถœ๋จ (์ค‘๋ณต)
  • i = 1 dfs("1", "01")
    • i = 0 dfs("10", "1")
      • i = 0 dfs("101", "") -> ์ข…๋ฃŒ
    • i = 1 dfs("11", "0")
      • i = 0 dfs("110", "") -> ์ข…๋ฃŒ
  • i = 2 dfs("1", "01") -> ์ด๋ฏธ ํ˜ธ์ถœ๋จ (์ค‘๋ณต)

์†Œ์ˆ˜ ํŒ๋ณ„ ๋ฉ”์„œ๋“œ

public static boolean isPrime(int n) {
	if(n < 2) return false;
		
    for(int i = 2; i <= Math.sqrt(n); i++) {
    	if(n % i == 0) return false;
    }
		
    return true;
}

ํฐ ์ˆ˜ ๋งŒ๋“ค๊ธฐ

๐Ÿ“‘ ๋ฌธ5) ์–ด๋–ค ์ˆซ์ž์—์„œ k๊ฐœ์˜ ์ˆ˜๋ฅผ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ˆซ์ž๋ฅผ ๊ตฌํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆซ์ž 1924์—์„œ ์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด [19, 12, 14, 92, 94, 24] ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘ ๊ฐ€์žฅ ํฐ ์ˆซ์ž๋Š” 94 ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ์ˆซ์ž number์™€ ์ œ๊ฑฐํ•  ์ˆ˜์˜ ๊ฐœ์ˆ˜ k๊ฐ€ solution ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. number์—์„œ k ๊ฐœ์˜ ์ˆ˜๋ฅผ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ํฐ ์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.


์ œํ•œ ์กฐ๊ฑด

  • number๋Š” 2์ž๋ฆฌ ์ด์ƒ, 1,000,000์ž๋ฆฌ ์ดํ•˜์ธ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.
  • k๋Š” 1 ์ด์ƒ number์˜ ์ž๋ฆฟ์ˆ˜ ๋ฏธ๋งŒ์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

numberkreturn
"1924"2"94"
"1231234"3"3234"
"4177252841"4"775841"

๋‚˜์˜ ํ’€์ด

package programmers;

import java.util.Stack;

public class MakingBigNum {
	
	public static String solution(String number, int k) {
    	
		Stack<Character> stack = new Stack<>();
		
		for(char c : number.toCharArray()) {
			while(!stack.isEmpty() && stack.peek() < c && k > 0) {
				stack.pop();
				k--;
			}
			stack.push(c);
			
		}
		
		while(k > 0) {
            stack.pop();
            k--;
        }
		
		StringBuilder sb = new StringBuilder();
		
		for(char c : stack) {
			sb.append(c);
		}
        
        return sb.toString();
    }
	
	public static void main(String[] args) {
		String number = "4177252841";
		solution(number, 4);
	}

}

0๊ฐœ์˜ ๋Œ“๊ธ€