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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 

 

 

 

๋ฌธ์ œ

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

์ œํ•œ ์‚ฌํ•ญ

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

 

 

 

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

  • ์ž…๋ ฅ : prices [1, 2, 3, 2, 3]
  • ์ถœ๋ ฅ : [4, 3, 1, 1, 0]

 

 

 

 

 

ํ’€์ด

n์ดˆ ์‹œ์ ์˜ ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์€ ๊ธฐ๊ฐ„์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋’ค์— ๋‚˜์˜ค๋Š” ๊ฐ€๊ฒฉ๋“ค๊ณผ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅด๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ์ด์ค‘ for๋ฌธ์œผ๋กœ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n^2)์ด๊ณ , ๋ฌธ์ œ์˜ ์ œํ•œ ์‚ฌํ•ญ์„ ๋ณด๋ฉด ๊ธธ์ด๊ฐ€ 100,000 ์ดํ•˜์ด๋ฏ€๋กœ ์ตœ๋Œ€ 100,000 * 100,000 = 100,000,000,000 (1000์–ต)์ด ๊ฑธ๋ฆฐ๋‹ค. ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค.

 

์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถฐ์•ผ ํ•˜๋Š”๋ฐ ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ฐ€๊ฒฉ ๋น„๊ต๋ฅผ ํ•˜๋Š” ๋ฐ, ๊ด€์‹ฌ์‚ฌ๋Š” ๋‹น์žฅ ๋‹ค์Œ์— ์˜ฌ ๊ฐ€๊ฒฉ์ด ํ˜„์žฌ ๊ฐ€๊ฒฉ๊ณผ ์ž‘์€์ง€ ํฐ์ง€์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ณ„์† ๊ฐ€๊ฒฉ ์ •๋ณด๋ฅผ ์Œ“์•„๋‚˜๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ์ด ์ ํ•ฉํ•˜๋‹ค.

 

  • ์Šคํƒ
    • ์‚ฝ์ž…, ์‚ญ์ œ, ์กฐํšŒ์— O(1) ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ์—์„œ๋Š” O(n)์ด ์†Œ์š”๋  ๊ฒƒ์ด๋‹ค.
    • ์Šคํƒ์— prices์˜ ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ๋Š”๋‹ค (๊ฐ€๊ฒฉ์˜ ์ •๋ณด๋Š” ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.)
    • ํ˜„์žฌ ๊ฐ€๊ฒฉ์ด top์— ์žˆ๋Š” ์ธ๋ฑ์Šค์˜ ๊ฐ€๊ฒฉ๋ณด๋‹ค ์ž‘์€์ง€ ๋น„๊ตํ•œ๋‹ค.
      • ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜๊ณ , ์ •๋‹ต์— ์ดˆ๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์ €์žฅํ•œ๋‹ค.
      • ์ž‘์œผ๋ฉด ๋ฐ˜๋ณตํ•œ๋‹ค.
    • ๋๋‚˜๋ฉด ํ˜„์žฌ ๊ฐ€๊ฒฉ์˜ ์ธ๋ฑ์Šค๋ฅผ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.
    • n๊นŒ์ง€ ๋‹ค ๋ณด๊ณ  ๋‚˜๋ฉด, ๋๋‚˜๊ณ  ๋‚˜๋ฉด ์Šคํƒ์— ๋‚จ์•„์žˆ๋Š” ์ฃผ์‹ ๊ฐ€๊ฒฉ์˜ ์ธ๋ฑ์Šค๋“ค์ด ์žˆ๋‹ค.
      • ์ดˆ ๊ณ„์‚ฐํ•ด์„œ ์ •๋‹ต์— ์ €์žฅํ•œ๋‹ค.

 

 

 

 

๋ฐฑ์ค€์˜ ์Šค์นด์ด๋ผ์ธ ์‰ฌ์šด๊ฑฐ ๋ฌธ์ œ(https://www.acmicpc.net/problem/1863)์™€ ๋น„์Šทํ•˜๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

import java.util.*;

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

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

 

๋ฐฐ์šด์ 

  • ์Šคํƒ์—์„œ ๋นผ๋‚ผ ๋•Œ, while(!stack.isEmpty() && ์กฐ๊ฑด) ์„ ํ•จ๊ป˜ ์ฃผ๋Š”๊ฒŒ ์ข‹์Œ
  • ์Šคํƒ์— ๋‚จ์€ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.
giraffe_