[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Java] - ํ’์„  ํ„ฐํŠธ๋ฆฌ๊ธฐ

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

ํ’์„  ํ„ฐํŠธ๋ฆฌ๊ธฐ
์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํ’์„  ํ„ฐํŠธ๋ฆฌ๊ธฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
school.programmers.co.kr

๐Ÿ’ก ๋ฌธ์ œ ํŒŒ์•…

  • ์ผ๋ ฌ๋กœ ๋†“์ธ 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;
    }
}