๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๐Ÿ—‚๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด(Java)

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] ๋’ค์— ์žˆ๋Š” ํฐ ์ˆ˜ ์ฐพ๊ธฐ

by ์‚๋šค์˜ค๋ฆฌ 2025. 9. 1.

๋ฌธ์ œ ์„ค๋ช…

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

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋’ค์— ์žˆ๋Š” ํฐ ์ˆ˜ ์ฐพ๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ์—ฐ์Šต ์นด์นด์˜คํ†ก ์นœ๊ตฌํ•ด์š”! ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ต์œก ์นด์นด์˜ค ์ฑ„๋„์„ ๋งŒ๋“ค์—ˆ์–ด์š”. ์—ฌ๊ธฐ๋ฅผ ๋ˆŒ๋Ÿฌ, ์นœ๊ตฌ ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ์„ธ์š”. ์‹ ๊ทœ ๊ต์œก ๊ณผ์ • ์†Œ์‹์€ ๋ฌผ๋ก  ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ์†Œ์‹์„ ๊ฐ€์žฅ ๋จผ์ € ์•Œ๋ ค

school.programmers.co.kr

์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด numbers๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๋“ค์— ๋Œ€ํ•ด ์ž์‹ ๋ณด๋‹ค ๋’ค์— ์žˆ๋Š” ์ˆซ์ž ์ค‘์—์„œ ์ž์‹ ๋ณด๋‹ค ํฌ๋ฉด์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์ด ์žˆ๋Š” ์ˆ˜๋ฅผ ๋’ท ํฐ ์ˆ˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ •์ˆ˜ ๋ฐฐ์—ด numbers๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ์›์†Œ์— ๋Œ€ํ•œ ๋’ท ํฐ์ˆ˜๋“ค์„ ์ฐจ๋ก€๋กœ ๋‹ด์€ ๋ฐฐ์—ด์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”. ๋‹จ, ๋’ท ํฐ ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์›์†Œ๋Š” -1์„ ๋‹ด์Šต๋‹ˆ๋‹ค.

์ œํ•œ ์‚ฌํ•ญ

  • 4 ≤ numbers์˜ ๊ธธ์ด ≤ 1,000,000
    • 1 ≤ numbers[i] ≤ 1,000,000

์ž…์ถœ๋ ฅ ์˜ˆ

numbers result
[2, 3, 3, 5] [3, 5, 5, -1]
[9, 1, 5, 3, 6, 2] [-1, 5, 6, 6,-1, -1]

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

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

  • 2์˜ ๋’ท ํฐ ์ˆ˜๋Š” 3์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ 3์˜ ๋’ท ํฐ์ˆ˜๋Š” 5์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ 3 ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
    5๋Š” ๋’ท ํฐ ์ˆ˜๊ฐ€ ์—†์œผ๋ฏ€๋กœ -1์ž…๋‹ˆ๋‹ค.
    ์œ„ ์ˆ˜๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์œผ๋ฉด [3, 5, 5, -1]์ด ๋ฉ๋‹ˆ๋‹ค.

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

  • 9๋Š” ๋’ท ํฐ์ˆ˜๊ฐ€ ์—†์œผ๋ฏ€๋กœ -1์ž…๋‹ˆ๋‹ค.
    1์˜ ๋’ท ํฐ ์ˆ˜๋Š” 5์ด๋ฉฐ, 5์™€ 3์˜ ๋’ท ํฐ์ˆ˜๋Š” 6์ž…๋‹ˆ๋‹ค.
    6๊ณผ 2๋Š” ๋’ท ํฐ ์ˆ˜๊ฐ€ ์—†์œผ๋ฏ€๋กœ -1์ž…๋‹ˆ๋‹ค.
    ์œ„ ์ˆ˜๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์œผ๋ฉด [-1, 5, 6, 6, -1, -1]์ด ๋ฉ๋‹ˆ๋‹ค.

 

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

import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {
        // ์ •๋‹ต์„ ์ €์žฅํ•  ๋ฐฐ์—ด ์ƒ์„ฑ
        int[] answer = new int[numbers.length];
        
        // ๋ฐฐ์—ด์„ ๋ชจ๋‘ -1๋กœ ์ฑ„์›€
        Arrays.fill(answer, -1);
        
        // ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•˜๋Š” ์Šคํƒ
        Deque<Integer> stack = new ArrayDeque<>();
        
        // ๋’ค์—์„œ๋ถ€ํ„ฐ ํƒ์ƒ‰
        for (int i = numbers.length - 1; i >= 0; i--) {
            int num = numbers[i];

            // ํ˜„์žฌ ์ˆซ์ž๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์€ ๋‹ค์Œ ํฐ ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ œ๊ฑฐ
            while (!stack.isEmpty() && stack.peek() <= num) {
                stack.pop();
            }
            
            // ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๋งจ ์œ„์˜ ๊ฐ’์ด '๋’ค์— ์žˆ๋Š” ํฐ ์ˆ˜'
            if (!stack.isEmpty()) {
                answer[i] = stack.peek();
            }
            
            // ํ˜„์žฌ ๊ฐ’์„ ์Šคํƒ์— ์ถ”๊ฐ€
            stack.push(num);
        }
        
        return answer;
    }
}

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

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ, ๊ฐ ์ˆซ์ž์— ๋Œ€ํ•ด ์ž์‹ ๋ณด๋‹ค ๋’ค์— ์žˆ๋Š” ์ˆซ์ž ์ค‘์—์„œ ์ฒ˜์Œ์œผ๋กœ ์ž์‹ ๋ณด๋‹ค ํฐ ์ˆ˜๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ํŒŒ์•…ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ์ง๊ด€์ ์œผ๋กœ๋Š”, ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํ˜„์žฌ ์ˆซ์ž ์ดํ›„์˜ ์›์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•˜์—ฌ ์ž์‹ ๋ณด๋‹ค ํฐ ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด ๋‹ต์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ๋– ์˜ฌ๋ž๋‹ค. ๋งŒ์•ฝ ๋๊นŒ์ง€ ๊ฐ€๋„ ํฐ ์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด -1์„ ์ €์žฅํ•˜๋„๋ก ํ–ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ, ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์›์†Œ์— ๋Œ€ํ•ด ๋’ค์ชฝ์„ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N^2)์ด ๋˜์–ด ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์‹ค์ œ๋กœ ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ–ˆ์ง€๋งŒ, ์ˆจ์€ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ๋น„๊ต๋ฅผ ์ค„์—ฌ์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐฐ์—ด์„ ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ณด๋ฉด์„œ, ์Šคํƒ์„ ํ™œ์šฉํ•ด "๋’ค์— ์žˆ๋Š” ํฐ ์ˆ˜" ํ›„๋ณด๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์Šคํƒ์— ํ•ญ์ƒ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๊ฐ’์ด ์œ ์ง€๋˜๋„๋ก ํ•˜์—ฌ, ํ˜„์žฌ ์ˆซ์ž๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’๋“ค์€ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜๊ณ , ๋‚จ์•„ ์žˆ๋Š” ์Šคํƒ์˜ ๋งจ ์œ„ ๊ฐ’์ด ๊ณง ํ˜„์žฌ ์ˆซ์ž์˜ "๋’ค์— ์žˆ๋Š” ํฐ ์ˆ˜"๊ฐ€ ๋œ๋‹ค. ๋งŒ์•ฝ ์Šคํƒ์ด ๋น„์–ด ์žˆ๋‹ค๋ฉด ๋’ค์— ์ž์‹ ๋ณด๋‹ค ํฐ ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋ฏ€๋กœ -1๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค. ์ด ๋ฐฉ์‹์€ ๊ฐ ์›์†Œ๊ฐ€ ํ•œ ๋ฒˆ push, ํ•œ ๋ฒˆ pop ๋˜๋ฏ€๋กœ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ๋„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๊ตญ ์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํ•œ ์™„์ „ ํƒ์ƒ‰ ๋ฐฉ์‹์œผ๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ž…๋ ฅ ํฌ๊ธฐ์— ๋”ฐ๋ผ ํšจ์œจ์„ฑ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๋‹จ์กฐ ๊ฐ์†Œ ์Šคํƒ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ์˜ ํ’€์ด์ž„์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.