- Array๋ฅผ 100๋ฒ ์ด์ ์ ๊ทผํ ์ ์๋ค๋ ์ ์ฝ์ด ๊ฑธ๋ ค์๋ ๊ฒฝ์ฐ ์ง์ ๋ ์ซ์์ index๋ฅผ ํจ์จ์ ์ผ๋ก ์ฐพ๋ ๋ฐฉ๋ฒ์ ๊ตฌํํ๋ค.
- ์ฌ์ค array ์ ๊ทผ ํ์์ ์ ํ์ด ์๋ค๋ฉด ์ฒ์๋ถํฐ ํ์ด์
target
์ ์ฐพ์๋ด๋ ๋๊ฒ ์ง๋งโฆ
- ๋จผ์ mountain array์ max index๋ฅผ ์ฐพ๋๋ค
findMax
. - max index๋ฅผ ์ฐพ๋๋ฐ์๋ binary search๋ฅผ ์ ์ฉํ ์ ์๋ค.
- ํ์ฌ ๋ฒ์
(start, end)
๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๊ฐ indexpivot
์ ์ ํ๋ค. - pivot์ ๊ธฐ์ค์ผ๋ก ์
before
, ํ์ฌcurrent
, ๋คafter
์ ๊ฐ์ ๊ตฌํ ๋ค ๋น๊ตํ๋ค. - ์ธ ๊ฐ ์ค
current
๊ฐ์ด ์ ์ผ ํฐ ๊ฐ์ด๋ผ๋ฉดpivot
์ด max index๊ฐ ๋๋ค. - ๊ฐ์ด ์ฆ๊ฐํ๋ ํํ๋ผ๋ฉด max index๋
pivot
์ค๋ฅธ์ชฝ์ ์์นํ ๊ฒ์ด๋ค. ์๋ํ๋ฉดpivot
์์น๋ ์ฐ์ ์ผ์ชฝ ์ฌ๋ถ๋ฉด์ด๊ธฐ ๋๋ฌธ์ด๋ค. - ๊ฐ์ด ๊ฐ์ํ๋ ํํ๋ผ๋ฉด max index๋
pivot
์ผ์ชฝ์ ์์นํ ๊ฒ์ด๋ค. ์๋ํ๋ฉดpivot
์์น๋ ์ฐ์ ์ค๋ฅธ์ชฝ ์ฌ๋ถ๋ฉด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- Max index๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ ๊ฐ๊ฐ binary search๋ฅผ ์ ์ฉํ๋ค
findTarget
. - ๋จ์ํ binary search๋ฅผ ์ ์ฉํ๋ ๊ฒ์ธ๋ฐ ์ผ์ชฝ ๋ฒ์๋ฅผ ๋จผ์ ์ฐพ๊ณ ์์ผ๋ฉด ์ค๋ฅธ์ชฝ์ ์ฐพ๋๋ค.
- ์ค๋ฅธ์ชฝ ๋ฒ์๋ฅผ ์ฐพ์๋๋ ๊ฐ์ด ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ๋์ด์์์ ์ฃผ์ํ๋ค.
class Solution { public: int findMax(MountainArray &m, int start, int end) { while (start < end) { int pivot = (end - start) / 2 + start; int before = pivot > 0? m.get(pivot - 1) : INT_MIN; int current = m.get(pivot); int after = pivot < end - 1? m.get(pivot + 1) : INT_MAX; if (before < current && current > after) { // max return pivot; } else if (before < current && current < after) { // increasing start = pivot + 1; } else { // descreasing end = pivot; } } return start; } int findTarget(MountainArray &m, int start, int end, int target, bool left) { while (start < end) { int pivot = (end - start) / 2 + start; int current = m.get(pivot); if (current == target) return pivot; else if ((target < current) == left) { end = pivot; } else { start = pivot + 1; } } return -1; } int findInMountainArray(int target, MountainArray &mountainArr) { int N = mountainArr.length(); int pivot = findMax(mountainArr, 0, N); int left = findTarget(mountainArr, 0, pivot, target, true); if (left != -1) return left; return findTarget(mountainArr, pivot, N, target, false); } };
ย