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

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] ํƒ๋ฐฐ์ƒ์ž

by ์‚๋šค์˜ค๋ฆฌ 2025. 10. 16.

๋ฌธ์ œ ์„ค๋ช…

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

 

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

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

programmers.co.kr

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

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

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

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

์ œํ•œ ์‚ฌํ•ญ

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

์ž…์ถœ๋ ฅ ์˜ˆ

order result
[4, 3, 1, 2, 5] 2
[5, 4, 3, 2, 1] 5

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

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

  • ๋ฌธ์ œ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

  • ๋ชจ๋“  ์ƒ์ž๋ฅผ ๋ณด์กฐ ์ปจํ…Œ์ด๋„ˆ ๋ฒจํŠธ์— ๋ชจ๋‘ ๋„ฃ๊ณ , ์—ญ์ˆœ์œผ๋กœ ํ•˜๋‚˜์”ฉ ๋นผ์„œ ํŠธ๋Ÿญ์— ์‹ฃ์Šต๋‹ˆ๋‹ค.

 

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

import java.util.*;

class Solution {
    public int solution(int[] order) {
        // ํŠธ๋Ÿญ์— ์ ์žฌํ•œ ์ƒ์ž์˜ ์ˆ˜
        int answer = 0;
        // order์˜ ๊ธธ์ด
        int len = order.length;
        // order์˜ ์ธ๋ฑ์Šค ์œ„์น˜
        int orders = 0;
        
        // ๋ณด์กฐ ์ปจ๋ฒ ์ด์–ด ์—ญํ• ์˜ ์Šคํƒ ์ƒ์„ฑ
        Stack<Integer> stack = new Stack<>();
        
        // ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์ƒ์ž ์ ์žฌ
        for (int i = 1; i <= len; i++) {
            // ๋ฐ”๋กœ ์ ์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด
            if(orders < len && i == order[orders]) {
                answer++;
                orders++;
            // ์ผ๋‹จ ๋ณด์กฐ ์ปจ๋ฒ ์ด์–ด์— ์ ์žฌ
            } else {
                stack.push(i);
            }
            
            // ์Šคํƒ์—์„œ ์—ฐ์†์œผ๋กœ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊บผ๋‚ด๊ธฐ
            while (orders < len && !stack.isEmpty() && stack.peek() == order[orders]) {
                stack.pop();
                answer++;
                orders++;
            }
        }
        
        // ๋‚จ์€ ์Šคํƒ ์ฒ˜๋ฆฌ (for ๋๋‚œ ๋’ค์—๋„ ๋” ์ ์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๊ณ„์† ์ง„ํ–‰)
        while (orders < len && !stack.isEmpty() && stack.peek() == order[orders]) {
            stack.pop();
            answer++;
            orders++;
        }
        
        // ์ •๋‹ต ๋ฐ˜ํ™˜
        return answer;
    }
}

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

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ, 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ƒ์ž๊ฐ€ ์ฐจ๋ก€๋กœ ๋“ค์–ด์˜ค๊ณ  ํŠธ๋Ÿญ์—๋Š” ์ฃผ์–ด์ง„ order ์ˆœ์„œ๋Œ€๋กœ๋งŒ ์‹ค์–ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ์„ ํ™•์ธํ–ˆ๋‹ค. ์ปจ๋ฒ ์ด์–ด์—์„œ ๊ณง๋ฐ”๋กœ ์‹ค์„ ์ˆ˜ ์—†์œผ๋ฉด ์ž„์‹œ๋กœ ์Œ“์•„๋‘์—ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ๊บผ๋‚ด์•ผ ํ•˜๋ฏ€๋กœ, “๋‚˜์ค‘์— ๋„ฃ์€ ๊ฒƒ์ด ๋จผ์ € ๋‚˜์˜จ๋‹ค” ํŠน์„ฑ์„ ๊ฐ€์ง„ ์Šคํƒ(java.util.Stack) ์ด ์ •ํ™•ํžˆ ๋งž๋Š”๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

์กฐ๊ฑด์„ ๋ถ„์„ํ•ด ๋ณด๋‹ˆ ํ•ต์‹ฌ์€ ๋‘ ๊ฐ€์ง€๋‹ค. ์ฒซ์งธ, ์ปจ๋ฒ ์ด์–ด์—์„œ ์ƒ์ž๋ฅผ ํ•˜๋‚˜ ๋ฐ›์„ ๋•Œ ๋ฐ”๋กœ ์‹ค์„ ์ˆ˜ ์—†์œผ๋ฉด ์Šคํƒ์— push ํ•ด์•ผ ํ•œ๋‹ค. ๋‘˜์งธ, ์Šคํƒ ๋งจ ์œ„๊ฐ€ ๋‹ค์Œ์œผ๋กœ ์‹ค์–ด์•ผ ํ•  ์ƒ์ž์™€ ๊ฐ™๋‹ค๋ฉด ๋งž์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์—ฐ์†ํ•ด์„œ pop ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ์ œ์ฒ˜๋Ÿผ ์Šคํƒ ์ƒ๋‹จ์ด ์—ฐ์†์œผ๋กœ order์™€ ๋งค์นญ๋˜๋Š” ๊ตฌ๊ฐ„์ด ์ƒ๊ธฐ๋ฏ€๋กœ, ๋‹จ๋ฐœ์„ฑ ๋น„๊ต๊ฐ€ ์•„๋‹ˆ๋ผ while ๋ฃจํ”„๋กœ ๊ฐ€๋Šฅํ•œ ๋งŒํผ ๋น„์šฐ๋Š” ํŒจํ„ด ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ณด์•˜๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ ์„ ํƒ์€ ๋ฌธ์ œ์˜ LIFO ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ํ‘œ์ค€ Stack ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ตฌํ˜„ ๊ด€์ ์—์„œ ํ•„์š”ํ•œ ์—ฐ์‚ฐ์€ push, pop, peek, isEmpty ๋„ค ๊ฐ€์ง€์— ์ง‘์ค‘ํ•˜๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค. (Stack ์ด ๋™๊ธฐํ™” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ๋”๋ผ๋„ ๋ณธ ๋ฌธ์ œ์˜ ์ž…๋ ฅ ๊ทœ๋ชจ์—์„œ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์ฒด๊ฐ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.)

๋กœ์ง ํ๋ฆ„์€ ๋‹ค์Œ ๋ถˆ๋ณ€์‹์„ ๋งค ์ƒ์ž๋งˆ๋‹ค ์œ ์ง€ํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.

  1. ์ปจ๋ฒ ์ด์–ด์—์„œ ์ƒ์ž i๋ฅผ ํ•˜๋‚˜ ๋ฐ›๋Š”๋‹ค.
  2. ์ผ๋‹จ ์Šคํƒ์— push(i) ํ•œ๋‹ค.
  3. ์Šคํƒ์ด ๋น„์–ด ์žˆ์ง€ ์•Š๊ณ  ์Šคํƒ ๋งจ ์œ„๊ฐ€ order[idx] ์™€ ๊ฐ™๋‹ค๋ฉด while๋กœ ์—ฐ์† pop ํ•˜๋ฉฐ ์‹ค์€ ๊ฐœ์ˆ˜์™€ idx๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
    ์ด ํŒจํ„ด์„ ์œ ์ง€ํ•˜๋ฉด ์ปจ๋ฒ ์ด์–ด ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ๋’ค์—๋„ ์Šคํƒ์— ๋‚จ์€ ์ƒ์ž๋“ค์ด ์ถ”๊ฐ€๋กœ ๋งž์•„๋–จ์–ด์งˆ ๊ฒฝ์šฐ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๋น„๊ต์—์„œ idx < n ๊ฒฝ๊ณ„ ์ฒดํฌ๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•ด order ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์˜ˆ๋ฐฉํ–ˆ๋‹ค.

์ฒ˜์Œ ์‹œ๋„์—์„œ๋Š” ํ•œ ํ„ด์— ์ตœ๋Œ€ ํ•œ ๋ฒˆ๋งŒ pop ํ•˜๊ฑฐ๋‚˜, ๋ฉ”์ธ ๋ฃจํ”„ ์ข…๋ฃŒ ํ›„ ์Šคํƒ์— ๋‚จ์€ ์ƒ์ž๋ฅผ ์ถ”๊ฐ€๋กœ ๋น„์šฐ์ง€ ์•Š์•„ ๋ˆ„๋ฝ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ฅผ ์—ฐ์† pop + ์ข…๋ฃŒ ํ›„ ์ž”์—ฌ ์Šคํƒ ์ฒ˜๋ฆฌ๋กœ ๋ณด์™„ํ•ด ์ •๋‹ต ๊ฐœ์ˆ˜๋ฅผ ์ •ํ™•ํžˆ ์ง‘๊ณ„ํ•˜๋„๋ก ํ–ˆ๋‹ค.