์ผ๋จ stones ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ 200000๊ฐ์ด๋ฏ๋ก, ์ด์ค for๋ฌธ์ ์ ๋ ์ฌ์ฉํ๋ฉด ์๋๋ค.
๋ฐ๋ผ์ ๋ฐฐ์ด์ ์์๊ฐ์ผ๋ก ์ด๋ถ ํ์์ ํด์ ๊ฐ์ ์ฐพ์์ผ ํ๋ค.
[2, 4, 5, 3, 2, 1, 4, 2, 5, 1]
์์ ์ฒ๋ผ ์์ ๊ฐ์ ๊ฒฝ์ฐ์์
์ ์ฒด 3์ ๊ฐ์ํ๋ฉด
[-1 1 2 0 -1 -2 1 -1 2 -2] ๊ฐ ๋๋๋ฐ, 0์ดํ์ธ ์์๊ฐ 3๊ฐ ์ฐ์์ผ๋ก ์กด์ฌํ๋ ๊ตฌ๊ฐ์ด ์๊ธฐ๋ฏ๋ก ๋ต์ด 3์ด ๋๋๊ฒ์ด๋ค.
๋ง์ฝ 2๋ฅผ ๊ฐ์ํ๋ฉด
[0 2 3 1 0 -1 2 0 3 -1] ์ด ๋์ด 0์ดํ์ธ ์์๊ฐ 3๊ฐ ์ฐ์์ผ๋ก ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์ ์ฌ๋์ด ๊ฑด๋๊ฐ ์ ์๋ค.
๋ฐ๋ผ์, ์ ์ฒด์ x๋ฅผ ๊ฐ์์์ผฐ์ ๋, 0์ดํ์ธ ๋์ด ์ฐ์์ผ๋ก k๊ฐ ์ด์ ์กด์ฌํ๋ x๊ฐ์ ์ด๋ถํ์์ผ๋ก ๊ตฌํ๋ฉด ๋๋ค.
์ด๊ธฐ๊ฐ์ left = stones ๋ฐฐ์ด์ ์ต์๊ฐ, right = stones ๋ฐฐ์ด์ ์ต๋๊ฐ ์ผ๋ก ๋๊ณ
mid = (left + right) / 2 ๊ฐ์ผ๋ก ์ ์ฒด ๊ฐ์๋ฅผ ํ๊ณ 0 ์ดํ์ ์ฐ์๋ ๋์ด ์กด์ฌํ๋์ง ํ์ธํ๋ค.
๋ง์ฝ ์กด์ฌํ๋ค๋ฉด ์ต์๊ฐ์ ์ฌ๋ ค์ ๊ฒ์ฌ๋ฅผ ํด๋ณด๋ฉด ๋๊ณ , ์กด์ฌํ์ง ์์ผ๋ฉด ์ต๋๊ฐ์ ๋ฎ์ถฐ์ ํ์์ ํ๋ฒ ๋ ํด๋ณด๋ฉด ๋๋ค.
import java.util.*;
class Solution {
public int solution(int[] stones, int k) {
int left = Arrays.stream(stones).min().getAsInt();
int right = Arrays.stream(stones).max().getAsInt();
while (left < right) {
int mid = (left + right) / 2;
if (isPossible(mid, stones, k)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
boolean isPossible(int num, int[] stones, int k) {
int possible = 0;
for (int stone : stones) {
if (stone - num <= 0) {
possible++;
} else {
possible = 0;
}
if (possible == k) {
return true;
}
}
return false;
}
}