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

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] ํ–„๋ฒ„๊ฑฐ ๋งŒ๋“ค๊ธฐ

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

๋ฌธ์ œ ์„ค๋ช…

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

 

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

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

programmers.co.kr

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒ์ˆ˜์˜ ์•ž์— ์Œ“์ด๋Š” ์žฌ๋ฃŒ์˜ ์ˆœ์„œ๊ฐ€ [์•ผ์ฑ„, ๋นต, ๋นต, ์•ผ์ฑ„, ๊ณ ๊ธฐ, ๋นต, ์•ผ์ฑ„, ๊ณ ๊ธฐ, ๋นต] ์ผ ๋•Œ, ์ƒ์ˆ˜๋Š” ์—ฌ์„ฏ ๋ฒˆ์งธ ์žฌ๋ฃŒ๊ฐ€ ์Œ“์˜€์„ ๋•Œ, ์„ธ ๋ฒˆ์งธ ์žฌ๋ฃŒ๋ถ€ํ„ฐ ์—ฌ์„ฏ ๋ฒˆ์งธ ์žฌ๋ฃŒ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ–„๋ฒ„๊ฑฐ๋ฅผ ํฌ์žฅํ•˜๊ณ , ์•„ํ™‰ ๋ฒˆ์งธ ์žฌ๋ฃŒ๊ฐ€ ์Œ“์˜€์„ ๋•Œ, ๋‘ ๋ฒˆ์งธ ์žฌ๋ฃŒ์™€ ์ผ๊ณฑ ๋ฒˆ์งธ ์žฌ๋ฃŒ๋ถ€ํ„ฐ ์•„ํ™‰ ๋ฒˆ์งธ ์žฌ๋ฃŒ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ–„๋ฒ„๊ฑฐ๋ฅผ ํฌ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, 2๊ฐœ์˜ ํ–„๋ฒ„๊ฑฐ๋ฅผ ํฌ์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ƒ์ˆ˜์—๊ฒŒ ์ „ํ•ด์ง€๋Š” ์žฌ๋ฃŒ์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด ingredient๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ƒ์ˆ˜๊ฐ€ ํฌ์žฅํ•˜๋Š” ํ–„๋ฒ„๊ฑฐ์˜ ๊ฐœ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์‹œ์˜ค.

์ œํ•œ ์‚ฌํ•ญ

  • 1 ≤ ingredient์˜ ๊ธธ์ด ≤ 1,000,000
  • ingredient์˜ ์›์†Œ๋Š” 1, 2, 3 ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’์ด๋ฉฐ, ์ˆœ์„œ๋Œ€๋กœ ๋นต, ์•ผ์ฑ„, ๊ณ ๊ธฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

ingredient result
[2, 1, 1, 2, 3, 1, 2, 3, 1] 2
[1, 3, 2, 1, 2, 1, 3, 1, 2] 0

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

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

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

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

  • ์ƒ์ˆ˜๊ฐ€ ํฌ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํ–„๋ฒ„๊ฑฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 

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

import java.util.*;

class Solution {
    public int solution(int[] ingredient) {
        // ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ–„๋ฒ„๊ฑฐ์˜ ๊ฐœ์ˆ˜
        int answer = 0;
        
        // ํ–„๋ฒ„๊ฑฐ ์žฌ๋ฃŒ ์ €์žฅํ•  ์Šคํƒ ์ƒ์„ฑ
        Deque<Integer> stack = new ArrayDeque<>();
        
        // ํ–„๋ฒ„๊ฑฐ ์žฌ๋ฃŒ ์ˆœํšŒํ•˜๋ฉด์„œ ํ–„๋ฒ„๊ฑฐ ๋งŒ๋“ค๊ธฐ
        for (int ing : ingredient) {
            // ์Šคํƒ์— ํ–„๋ฒ„๊ฑฐ ์žฌ๋ฃŒ ์ €์žฅ
            stack.push(ing);
            
            // ์Šคํƒ์˜ ํฌ๊ธฐ๊ฐ€ 4 ์ด์ƒ์ผ ๊ฒฝ์šฐ ์žฌ๋ฃŒ ํ™•์ธ
            if (stack.size() >= 4) {
                // ์ˆœ์„œ๋Œ€๋กœ ์žฌ๋ฃŒ ์ €์žฅ
                int a = stack.pop();
                int b = stack.pop();
                int c = stack.pop();
                int d = stack.pop();
                
                // ํ–„๋ฒ„๊ฑฐ ํŒจํ„ด๊ณผ ๋น„๊ตํ•˜์—ฌ ๋งž์„ ๊ฒฝ์šฐ ํ–„๋ฒ„๊ฑฐ ๊ฐœ์ˆ˜ +1
                if (d == 1 && c == 2 && b == 3 && a == 1) {
                    answer++;
                // ์•„๋‹ ๊ฒฝ์šฐ ์žฌ๋ฃŒ ๋˜๋Œ๋ฆฌ๊ธฐ
                } else {
                    stack.push(d);
                    stack.push(c);
                    stack.push(b);
                    stack.push(a);
                }
            }
        }
        
        // ๋งŒ๋“  ํ–„๋ฒ„๊ฑฐ ๊ฐœ์ˆ˜ ๋ฐ˜ํ™˜
        return answer;
    }
}

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

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

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

๊ทธ๋ž˜์„œ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” Deque๋ฅผ ์Šคํƒ์ฒ˜๋Ÿผ ์“ฐ๋Š” ๊ฒŒ ์ตœ์ ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ๋‹ค. ์Šคํƒ์€ ํ•ญ์ƒ ๋งจ ์œ„(๊ฐ€์žฅ ์ตœ์‹ )๋งŒ ๋ณด๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— “์ตœ๊ทผ 4๊ฐœ” ๊ฒ€์‚ฌ์— ๋”ฑ ๋งž๊ณ , push/pop์ด O(1)๋กœ ๊ฐ€๋ณ๋‹ค. ๋˜ํ•œ Deque๋Š” ์ธ๋ฑ์Šค ์ ‘๊ทผ(get)์ด ์—†์–ด ์‹ค์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์ ๊ณ , peek๋งŒ์œผ๋กœ๋Š” 4๊ฐœ ๋™์‹œ ํ™•์ธ์ด ์–ด๋ ค์šฐ๋‹ˆ ํ•„์š”์‹œ 4๊ฐœ๋ฅผ ๊บผ๋‚ด์„œ ํ™•์ธํ•œ ๋’ค ๋งž์œผ๋ฉด ๋ฒ„๋ฆฌ๊ณ , ์•„๋‹ˆ๋ฉด ๋ณต์›ํ•˜๋Š” ๋ฐฉ์‹์ด ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.

๋กœ์ง ํ๋ฆ„์€ ์ด๋ ‡๋‹ค. ์žฌ๋ฃŒ๋ฅผ ํ•˜๋‚˜์”ฉ push ํ•˜์—ฌ ์Œ“๋Š”๋‹ค. ์Šคํƒ ํฌ๊ธฐ๊ฐ€ 4 ์ด์ƒ์ด ๋˜๋Š” ์ˆœ๊ฐ„๋งˆ๋‹ค ๋งจ ์œ„์—์„œ 4๊ฐœ๋ฅผ pop ํ•ด ์ž„์‹œ ๋ฒ„ํผ(๊ธธ์ด 4์งœ๋ฆฌ ๊ณ ์ • ๋ฐฐ์—ด ๋“ฑ)์— ๋‹ด๋Š”๋‹ค. pop์˜ ํŠน์„ฑ์ƒ ๊บผ๋‚ธ ์ˆœ์„œ๋Š” ์œ„→์•„๋ž˜์ด๋ฏ€๋กœ, ๋น„๊ต ์‹œ ์—ญ์ˆœ ์ •ํ•ฉ์„ฑ์„ ์œ ์˜ํ•ด 1-2-3-1 ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ผ์น˜ํ•˜๋ฉด ์ด๋ฏธ 4๊ฐœ๊ฐ€ ์ œ๊ฑฐ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ๋ณต์› ์—†์ด ์นด์šดํŠธ๋งŒ ์ฆ๊ฐ€ํ•œ๋‹ค. ๋ถˆ์ผ์น˜ํ•˜๋ฉด ๋ฐฉ๊ธˆ ๊บผ๋‚ธ 4๊ฐœ๋ฅผ ์›๋ž˜ ์ˆœ์„œ๋กœ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด ๊บผ๋‚ธ ์—ญ์ˆœ์œผ๋กœ ๋‹ค์‹œ push ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ๋๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด, ์„œ๋กœ ๊ฒน์น˜๋Š” ํŒจํ„ด๋„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ ์„ธ ๊ฐ€์ง€๋‹ค. ์ฒซ์งธ, Deque์—๋Š” ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ get์ด ์—†์œผ๋‹ˆ ์ธ๋ฑ์Šค๋กœ ๋น„๊ตํ•˜๋ ค ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๋‘˜์งธ, peek๋งŒ์œผ๋กœ๋Š” 4๊ฐœ๋ฅผ ๋™์‹œ์— ์•ˆ์ „ํ•˜๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์…‹์งธ, ์ž„์‹œ ๋ฒ„ํผ๋Š” ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด์„ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค ๋ฆฌ์ŠคํŠธ/๋ฐฐ์—ด์„ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์— ์œ ๋ฆฌํ•˜๋‹ค. ๋ฐฐ์—ด ๋น„๊ต๋Š” ์ฐธ์กฐ ๋™๋“ฑ์„ฑ(==)์ด ์•„๋‹ˆ๋ผ ๋‚ด์šฉ ๋น„๊ต๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๋„ ์žŠ์ง€ ์•Š๋Š”๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ž…๋ ฅ ๊ธธ์ด๋ฅผ n์ด๋ผ ํ•  ๋•Œ, ๊ฐ ์›์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ push ํ•˜๊ณ , ๊ฒ€์‚ฌ ์‹œ ์ตœ๋Œ€ 4๋ฒˆ์˜ pop/push๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์ „์ฒด๊ฐ€ O(n)์ด๋‹ค. ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์Šคํƒ๊ณผ ๊ธธ์ด 4์˜ ์ž„์‹œ ๋ฒ„ํผ ์ •๋„๋กœ O(n)/O(1) ์ˆ˜์ค€์ด๋ฉฐ, ArrayList ๊ธฐ๋ฐ˜์˜ ๋ฐ˜๋ณต ์‚ญ์ œ·์žฌ๊ฒ€์‚ฌ๋ณด๋‹ค ํ›จ์”ฌ ์•ˆ์ •์ ์œผ๋กœ ํšจ์œจ์„ฑ ์กฐ๊ฑด์„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.