๐ ๋ฌธ์ ๋งํฌ
ํ์ ํฐํธ๋ฆฌ๊ธฐ
์ฝ๋ฉํ
์คํธ ์ฐ์ต - ํ์ ํฐํธ๋ฆฌ๊ธฐ ๋ฌธ์ ์
๋๋ค.
๐ก ๋ฌธ์ ํ์
- ์ผ๋ ฌ๋ก ๋์ธ
n๊ฐ์ ํ์ ์ค, ์ธ์ ํ ๋ ํ์ ์ค ํ๋๋ฅผ ๊ณ์ ํฐ๋จ๋ ค์ ๊ฒฐ๊ตญ 1๊ฐ๋ง ๋จ๊ธฐ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. - ์ด๋ ์ต์ข ์ ์ผ๋ก ๋จ์ ์ ์๋ ํ์ ์ ๊ฐ์(๊ฒฝ์ฐ์ ์๊ฐ ์๋๋ผ, ๋ง์ง๋ง๊น์ง ์ด์๋จ์ ๊ฐ๋ฅ์ฑ์ด ์๋ ํ์ ๊ฐ์)๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
n์ด ์ต๋ 100๋ง์ด๋ฏ๋กO(N^2)์ด์์ ์์ ํ์์ผ๋ก๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
๐๏ธ ์ ๊ทผ ๋ฐฉ๋ฒ
- ์ด๋ค ํ์
i๊ฐ ๋๊น์ง ์ด์๋จ์ผ๋ ค๋ฉด, ์ผ์ชฝ์์ ์จ ํ์ ์ด๋ ์ค๋ฅธ์ชฝ์์ ์จ ํ์ ์ด๋ ํ๋๋ง ์๋ํ๋ฉด ๋๋ค๋ ์ ์ ์ฐฉ์ํ๋ค. - ์ฆ
i๋ฒ ํ์ ์ "์ผ์ชฝ ๊ตฌ๊ฐ์์ ์ด์๋จ์ ํ๋" ๋๋ "์ค๋ฅธ์ชฝ ๊ตฌ๊ฐ์์ ์ด์๋จ์ ํ๋"์๋ง ๋น๊ตํด์ ์ด๊ธฐ๋ฉด ๋๋ค. i๋ฒ ํ์ ์ด ์ผ์ชฝ ๊ตฌ๊ฐ์ ์ต์๊ฐ(leftMin[i])๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๊ฑฐ๋, ์ค๋ฅธ์ชฝ ๊ตฌ๊ฐ์ ์ต์๊ฐ(rightMin[i])๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ๋ง์ง๋ง๊น์ง ์ด์๋จ์ ์ ์๋ค.leftMin,rightMin๋ฐฐ์ด์ ๊ฐ๊ฐ ์ผ์ชฝ์์, ์ค๋ฅธ์ชฝ์์ ํ ๋ฒ์ฉ ์ํํ๋ฉฐ ๋์ ์ต์๊ฐ์ผ๋ก ๋ฏธ๋ฆฌ ๊ตฌํด๋๋ฉดO(N)์ ํ๋ณํ ์ ์๋ค.
๐งฉ ์ฝ๋ ๊ตฌํ
class Solution {
public int solution(int[] a) {
int answer = 0;
int n = a.length;
int[] leftMin = new int[n];
int[] rightMin = new int[n];
leftMin[0] = a[0];
for (int i = 1; i < n; ++i) {
leftMin[i] = Math.min(leftMin[i - 1], a[i]);
}
rightMin[n - 1] = a[n - 1];
for (int i = n - 2; i >= 0; --i) {
rightMin[i] = Math.min(rightMin[i + 1], a[i]);
}
for (int i = 0; i < n; ++i) {
if (a[i] <= leftMin[i] || a[i] <= rightMin[i]) {
answer++;
}
}
return answer;
}
}