๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/42584
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก, ์ฑ์ฉ๊น์ง Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๋ฌธ์ ์์ฝ
์ด ๋จ์ ์ฃผ์๊ฐ๊ฒฉ ๋ฐฐ์ด prices์ ๋ํด ๊ฐ๊ฒฉ์ด ๋จ์ด์ง์ง ์์ ๊ธฐ๊ฐ์ ๋ช ์ด์ธ์ง ๋ฐํํ๊ธฐ
- ์: [1,2,3,2,3] → [4,3,1,1,0]
์ ํ
- prices์ ๊ฐ ๊ฐ๊ฒฉ์ 1 ์ด์ 10,000 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- prices์ ๊ธธ์ด๋ 2 ์ด์ 100,000 ์ดํ์ ๋๋ค.
ํ์ด
prices์ ๊ธธ์ด๊ฐ ์ต๋ 10^6์ด๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ `O(N)` ์ด์ด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ i์ด ์์ ์ฃผ์ ๊ฐ๊ฒฉ์ด ์ธ์ ๋จ์ด์ง๋์ง ๊ทธ ๋ค๋ฅผ ๋งค๋ฒ ํ์ธํ๋ค๋ฉด, `O(N^2)`์ด๋ฏ๋ก ์ด ๋ฐฉ์์ผ๋ก ํ์ดํ๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋ ๊ฒ์ ๋๋ค.
O(N)์ผ๋ก ํ๋ ค๋ฉด, prices ์์๋ฅผ ํ๋์ฉ ์ํํ๋ฉด์ ๋์์ ์ ๋ต๋ ์ ๋ฐ์ดํธํด์ผ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ ๋ต์ ์ ๋ฐ์ดํธํ๋ ์์ ์ ์ธ์ ์ผ๊น์?
์ฃผ์ด์ง ์์ ๋ฅผ ํ ๋ฒ ์ดํด๋ด ์๋ค.
[1,2,3,2,3]
- idx=1, idx=2, idx=4: ์ด์ ๊ฐ๋ณด๋ค ํฌ๋ฉด ์ ๋ฐ์ดํธํ ํ์ ์์ต๋๋ค.
- idx=3: ์ด์ ๊ฐ๋ณด๋ค ์์์ก์ผ๋ฏ๋ก idx 2์ ์ ๋ต์ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
- idx 1์ ์ ๋ต์ ์์ ๊ฐ์ด ๋์ผํ๋ฏ๋ก ์ ๋ฐ์ดํธํ์ง ์์๋ ๋ฉ๋๋ค.
- ์์ ์๋ ์์ง๋ง ์ด์ ๊ฐ๋ณด๋ค ๋์ผํ ๊ฐ์ด ๋์์ ๋๋ ์
๋ฐ์ดํธํ ํ์ ์์ต๋๋ค.
- ex. [1,2,2], [3,2,2] → ๋ ์ํฉ ๋ชจ๋ ๋ ๋ฒ์งธ 2์์๋ ์ ๋ต์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ ๋ต์ ์ ๋ฐ์ดํธํ๋ ์์ ์ “์ด์ ๊ฐ๋ณด๋ค ์์ ๊ฐ์ด ๋์์ ๋”์ ๋๋ค.
๊ทผ๋ฐ ๋ฌธ์ ๋ ์ด ์์ ์์ ์์ ์ธ๋ฑ์ค์ ์ ๋ต์ด ํ์ ๋ ์๋ ์๊ณ , ์๋ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์์ผ๋ก ํ๋์ฉ ๊ฐ๋ฉด์ ์ ๋ต์ ํ์ ํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ idx 3์์ ์์ ์ธ๋ฑ์ค์ ์ ๋ต์ ์ ๋ฐ์ดํธํด์ผ ํ ๋, idx 2์ ์ ๋ต์ ํ์ ๋์ง ์์๋๋ฐ idx 1์ ์ ๋ต๋ง ํ์ ๋๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. idx 3 ์ด์ ์ ์ ๋ต์ด ํ์ ๋์ง ์์ ์ํ์๋ค๋ ๊ฒ์ idx 1 ≤ idx 2 ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- `idx=i`์ ๋ํด `prices [i]<prices [i-1]`์ธ์ง ํ์ธํ๋ค.
- ๋ง์ฝ ๋ง๋ค๋ฉด, ์ ๋ต์ด ํ์ ๋๋ฉฐ ์ ๋ต์ `i-(i-1)`์ด๋ค.
- ์ธ๋ฑ์ค `i-2`์ ์ ๋ต์ด ํ์ ๋์ง ์์๋ค๋ฉด, `prices [i]<prices [i-2]`์ธ์ง ํ์ธํ๋ค.
- …
- ์ธ๋ฑ์ค `i-2`์ ์ ๋ต์ด ํ์ ๋์ง ์์๋ค๋ฉด, `prices [i]<prices [i-2]`์ธ์ง ํ์ธํ๋ค.
- ์๋๋ผ๋ฉด, `i`์ ๊ฐ์ 1 ์ฆ๊ฐ์ํจ๋ค.
- ๋ง์ฝ ๋ง๋ค๋ฉด, ์ ๋ต์ด ํ์ ๋๋ฉฐ ์ ๋ต์ `i-(i-1)`์ด๋ค.
- ๋ง์ง๋ง์ ์ ๋ต์ด ํ์ ๋์ง ์์ ๋ชจ๋ ์ธ๋ฑ์ค๋ค์ ์ ๋ต์ด `(prices์ ๊ธธ์ด)-1-(์์ ์ ์ธ๋ฑ์ค)`์ ๋๋ค.
`i` ๊ฐ์ ์์์๋ถํฐ ์ฆ๊ฐํ์ง๋ง(ํ์ ), ์ ๋ต ํ์ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ ๋ ๋ท๋ฒํธ๋ถํฐ ๊ฒ์ฌํฉ๋๋ค.(์ ์ถ)
๋ฐ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๋ ์คํ์ ํ์ฉํ๋ฉด ๋ฉ๋๋ค!
์ ๋ต์ด ํ์ ๋์ง ์์ ์ธ๋ฑ์ค๋ ์คํ์ push ํ๊ณ , ์ ๋ต์ด ํ์ ๋๋ ์์ ์ pop ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํ ์ ์์ต๋๋ค.
์ฝ๋
import java.util.*;
class Solution {
public int[] solution(int[] prices) {
Stack<Integer> stack = new Stack<>();
int[] answer = new int[prices.length];
stack.push(0);
int i;
for(i=1; i<prices.length; i++){
while(!stack.isEmpty() && prices[stack.peek()]>prices[i]){
int idx = stack.pop();
answer[idx] = i-idx;
}
stack.push(i);
}
while(!stack.isEmpty()){
int idx = stack.pop();
answer[idx] = i-idx-1;
}
return answer;
}
}
๐ท ์๊ฐ ๋ณต์ก๋
- `N`: prices์ ๊ธธ์ด
- stack์ ๊ธฐ์ค์ผ๋ก prices์ ์์๋ค์ด ํ ๋ฒ์ฉ๋ง push, pop ๋ฉ๋๋ค.
- push ์ฐ์ฐ: N๋ฒ
- pop ์ฐ์ฐ: N๋ฒ
- `O(N+N)` = `O(N)`
- ์ต์ข ์๊ฐ ๋ณต์ก๋: `O(N)`
๐ท ์คํ ์๋
Time: 37.95 ms, Memory: 73.5 MB
'๐ช Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ/๋ฐฑ์ค] 4963. ์ฌ์ ๊ฐ์ (JAVA) (1) | 2025.02.07 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค] ํฌ๋ ์ธ ์ธํ๋ฝ๊ธฐ ๊ฒ์ (JAVA) (1) | 2025.02.06 |
| [ํ๋ก๊ทธ๋๋จธ์ค] ์ง์ง์ด ์ ๊ฑฐํ๊ธฐ (JAVA) (1) | 2025.02.04 |
| [ํ๋ก๊ทธ๋๋จธ์ค] ๊ดํธ ํ์ ํ๊ธฐ (JAVA) (2) | 2025.02.04 |