1095. Find in Mountain Array

  • Array๋ฅผ 100๋ฒˆ ์ด์ƒ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ œ์•ฝ์ด ๊ฑธ๋ ค์žˆ๋Š” ๊ฒฝ์šฐ ์ง€์ •๋œ ์ˆซ์ž์˜ index๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•œ๋‹ค.
    • ์‚ฌ์‹ค array ์ ‘๊ทผ ํšŸ์ˆ˜์— ์ œํ•œ์ด ์—†๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ํ›‘์–ด์„œ target์„ ์ฐพ์•„๋‚ด๋„ ๋˜๊ฒ ์ง€๋งŒโ€ฆ
  • ๋จผ์ € mountain array์˜ max index๋ฅผ ์ฐพ๋Š”๋‹ค findMax.
    • max index๋ฅผ ์ฐพ๋Š”๋ฐ์—๋„ binary search๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ ๋ฒ”์œ„ (start, end)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ค‘๊ฐ„ index pivot์„ ์ •ํ•œ๋‹ค.
    • 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); } };
ย