๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿงฉ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๐Ÿต ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด(Java)

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] ์ฃผ์‹๊ฐ€๊ฒฉ

by carrot0911 2025. 4. 11.

๋ฌธ์ œ ์„ค๋ช…

https://school.programmers.co.kr/learn/courses/30/lessons/42584

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

์ดˆ ๋‹จ์œ„๋กœ ๊ธฐ๋ก๋œ ์ฃผ์‹๊ฐ€๊ฒฉ์ด ๋‹ด๊ธด ๋ฐฐ์—ด prices๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์€ ๊ธฐ๊ฐ„์€ ๋ช‡ ์ดˆ์ธ์ง€๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

  • prices์˜ ๊ฐ ๊ฐ€๊ฒฉ์€ 1 ์ด์ƒ 10,000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • prices์˜ ๊ธธ์ด๋Š” 2 ์ด์ƒ 100,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

prices return
[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]

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

์ž…์ถœ๋ ฅ ์˜ˆ #1

  • 1์ดˆ ์‹œ์ ์˜ โ‚ฉ1์€ ๋๊นŒ์ง€ ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • 2์ดˆ ์‹œ์ ์˜ โ‚ฉ2์€ ๋๊นŒ์ง€ ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • 3์ดˆ ์‹œ์ ์˜ โ‚ฉ3์€ 1์ดˆ๋’ค์— ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 1์ดˆ๊ฐ„ ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.
  • 4์ดˆ ์‹œ์ ์˜ โ‚ฉ2์€ 1์ดˆ๊ฐ„ ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • 5์ดˆ ์‹œ์ ์˜ โ‚ฉ3์€ 0์ดˆ๊ฐ„ ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

class Solution {
    public int[] solution(int[] prices) {
        // ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด ์ƒ์„ฑ
        int[] answer = new int[prices.length];
        
        // i : ํ˜„์žฌ ๊ฐ€๊ฒฉ์˜ ์‹œ์ 
        for (int i = 0; i < prices.length; i++) {
            // j : ๋‹ค์Œ ์‹œ์ ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ™•์ธ
            for (int j = i+1; j < prices.length; j++) {
                // ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์•˜์„ ๋•Œ ์‹œ๊ฐ„ 1์ดˆ ๊ฒฝ๊ณผ
                answer[i]++;
                // ๋งŒ์•ฝ ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์กŒ๋‹ค๋ฉด
                if (prices[i] > prices[j]) {
                    // ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ
                    break;
                }
            }
        }
        // answer ๋ฐ˜ํ™˜
        return answer;
    }
}

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ•œ ๋ฐฉํ–ฅ

Stack์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด๋งŒ์œผ๋กœ๋„ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค.
๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์„  ๊ฐ ์ž๋ฆฌ ์ˆ˜๋ฅผ ๊ณ„์† 1์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉด ์ •๋‹ต์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

Stack์„ ํ™œ์šฉํ•œ ์ฝ”๋“œ

import java.util.*;

class Solution {
    public int[] solution(int[] prices) {
        // ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด ์ƒ์„ฑ
        int[] answer = new int[prices.length];
        // ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•  Stack ์ƒ์„ฑ (๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์€ ์‹œ์  ์ €์žฅ)
        Stack<Integer> stack = new Stack<>();
        
        // ์ฃผ์‹ ๊ฐ€๊ฒฉ ์ˆœํšŒ
        for (int i = 0; i < prices.length; i++) {
            // Stack์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ฑฐ๋‚˜ ํ˜„์žฌ ๊ฐ€๊ฒฉ์ด ์ด์ „ ๊ฐ€๊ฒฉ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ
            while (!stack.isEmpty() && prices[i] < prices[stack.peek()]) {
                // ๋–จ์–ด์ง„ ์‹œ์ ๊นŒ์ง€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„ ๊ณ„์‚ฐ
                answer[stack.peek()] = i - stack.peek();
                // Stack์—์„œ ์ œ๊ฑฐ
                stack.pop();
            }
            // ๋–จ์–ด์ง€์ง€ ์•Š์€ ์‹œ์  ์ €์žฅ
            stack.push(i);
        }
        
        // Stack์— ๋‚จ์•„ ์žˆ๋Š” ์ธ๋ฑ์Šค ํ™•์ธ
        while(!stack.isEmpty()) {
            // ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์œ ์ง€๋œ ์‹œ๊ฐ„ ๊ณ„์‚ฐ
            answer[stack.peek()] = prices.length - stack.peek() - 1;
            // Stack์—์„œ ์ œ๊ฑฐ
            stack.pop();
        }
        
        // answer ๋ฐ˜ํ™˜
        return answer;
    }
}

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ•œ ๋ฐฉํ–ฅ

Stack์„ ํ™œ์šฉํ•œ ๋ฐฉ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๋‹ค๋ฅธ ํ’€์ด ๋ฐฉ๋ฒ•๋“ค์„ ์ฐพ์•„๋ณด๋ฉด์„œ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ”๋‹ค.
Stack์„ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๋ฅผ ๋” ํŽธํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.