2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด์ญ ์ง๊ฒ๋ค๋ฆฌ ๊ฑด๋๊ธฐ
์นด์นด์ค ์ด๋ฑํ๊ต์ ๋๋์ฆ ์น๊ตฌ๋ค์ด ๋ผ์ด์ธ ์ ์๋๊ณผ ํจ๊ป ๊ฐ์ ์ํ ์ค ๊ฐ์ธ์ ๊ฑด๋๊ธฐ ์ํด ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ๊ฑด๋์ผ ํ๋ค.
๊ฐ ๋๋ค๋์๋ ์ซ์๊ฐ ์ฐ์ฌ ์์ผ๋ฉฐ, ๋ฐ์ ๋๋ง๋ค ์ซ์๊ฐ 1์ฉ ๊ฐ์ํ๋ค.
stones๋ ๊ฐ ๋๋ค๋์ ์ด๊ธฐ ์ซ์(๋ด๊ตฌ๋)๋ฅผ ์๋ฏธํ๋ค.k๋ ํ ๋ฒ์ ๊ฑด๋๋ธ ์ ์๋ ์ต๋ ์นธ ์์ด๋ค.stones ๋ฐฐ์ด ๊ธธ์ด: 1 ~ 200,000k: 1 ~ stones.length| stones | k | result |
|---|---|---|
| [2, 4, 5, 3, 2, 1, 4, 2, 5, 1] | 3 | 3 |
3๋ช ๊น์ง๋ ๊ฑด๋ ์ ์์ง๋ง, 4๋ฒ์งธ๋ ์ฐ์์ผ๋ก ๋ฐ์ ์ ์๋ ๋๋ค๋ ๊ตฌ๊ฐ์ด ์๊ฒจ ๊ฑด๋์ง ๋ชปํ๋ค.
์ฒซ ๋ฒ์งธ ์น๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์์ต๋๋ค.

์ฒซ ๋ฒ์งธ ์น๊ตฌ๊ฐ ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ํ ๋๋ค๋์ ์ ํ ์ซ์๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
๋ ๋ฒ์งธ ์น๊ตฌ๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์์ต๋๋ค.

๋ ๋ฒ์งธ ์น๊ตฌ๊ฐ ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ํ ๋๋ค๋์ ์ ํ ์ซ์๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
์ธ ๋ฒ์งธ ์น๊ตฌ๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์์ต๋๋ค.
์ธ ๋ฒ์งธ ์น๊ตฌ๊ฐ ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ํ ๋๋ค๋์ ์ ํ ์ซ์๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.

๋ค ๋ฒ์งธ ์น๊ตฌ๊ฐ ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋ ค๋ฉด, ์ธ ๋ฒ์งธ ๋๋ค๋์์ ์ผ๊ณฑ ๋ฒ์งธ ๋๋ค๋๋ก ๋ค ์นธ์ ๊ฑด๋๋ฐ์ด์ผ ํฉ๋๋ค. ํ์ง๋ง k = 3 ์ด๋ฏ๋ก ๊ฑด๋๋ธ ์ ์์ต๋๋ค.

๋ฐ๋ผ์ ์ต๋ 3๋ช ์ด ๋๋ค๋์ ๋ชจ๋ ๊ฑด๋ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ฒ์ ๋ณด์์ ๋๋ ๋ฐฐ์ด์ ๋๋ฉด์ ์กฐ๊ฑด์ ํ์ธํ๋ ์์ ํ์์ด ๊ฐ์ฅ ๋ ์ฌ๋์ง๋ง, ์์ ํ์์ผ๋ก๋ ์ ๋ ํ ์ ์๋ ๋ฌธ์ ์ด๋ค.
๋ง์ฝ โ1๋ช
, 2๋ช
โฆ ๊ณ์ ์ฆ๊ฐ์ํค๋ฉฐ ์์ ํ์โ์ ์๋ํ๋ฉด
์ต ร ์ต ์์ค์ ์ฐ์ฐ์ด ๋ฐ์ํ์ฌ ์ ๋๋ก ์๊ฐ ๋ด์ ๋ชป ๋๋๋ค.
์ด ๋ฌธ์ ๋ โ์ ๋ต์ ์ง์ ์ฐพ๋โ ๋ฌธ์ ๊ฐ ์๋๋ผ
โ์ ๋ต์ ๊ฐ์ ํ๊ณ ๊ฐ๋ฅํ์ง ์ฒดํฌํ๋โ ์ด๋ถํ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋ ๋ฌธ์ ๋ค.
์ด๋ถํ์์ด๋ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ์ํ๋ target ๊ฐ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด ๊ฐ์ ์ฐพ๊ธฐ ์ํด์๋ ๋ฐฐ์ด์ ์ค๊ฐ ๊ฐ์ mid๋ก ๋๊ณ target์ด mid ๋ณด๋ค ํฐ์ง ์์์ง๋ฅผ ํ๋จํ์ฌ ๋ฒ์๋ฅผ ์ขํ๋๊ฐ๋ค.
์ด๋ถํ์์ ์๊ฐ๋ณต์ก๋๊ฐ O(logN)์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ์ฒ๋ผ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ด๋ง๋ฌด์ํ๊ฒ ํฐ ๊ฒฝ์ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
์ด๋ถํ์ ์์ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid; // Target ๋ฐ๊ฒฌ
} else if (arr[mid] < target) {
left = mid + 1; // ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฒ์ ์ด๋
} else {
right = mid - 1; // ์ผ์ชฝ์ผ๋ก ๋ฒ์ ์ด๋
}
}
return -1; // ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ
}
}
๊ทธ๋ฌ๋, ์ด ๋ฌธ์ ๋ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ๊ฐ์ ์ฐพ๋ ๋ฌธ์ ๊ฐ ์๋๊ณ
์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต๋๊ฐ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ ํ๋ผ๋ฉํธ๋ฆญ ์์น๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํ๋ผ๋ฉํธ๋ฆญ ์์น๋ ์ด๋ถํ์๊ณผ ๋น์ทํ์ง๋ง ์ด๋ถํ์๊ณผ ๋ฌ๋ฆฌ ์ฃผ์ด์ง ์ผ๋ จ์ ๋ฐฐ์ด์์ ์ฐพ๋ ๊ฒ์ด ์๋๋ผ ํน์ ๋ฒ์ ๋ด์์ ์ํ๋ ์กฐ๊ฑด์ ์ผ์นํ๋ ๊ฐ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฆ,
left = 1
right = max(stones)
๋ก ๋๊ณ ํ์์ ์์ํ๋ค.
mid๋ช
์ ๋ณด๋๋ค๊ณ โ๊ฐ์ โํ๋ฉด,
๋ชจ๋ ๋์ ๋ด๊ตฌ๋๋ stones[i] - mid๊ฐ ๋๋ค.
์ด๋ ์ฐ์ํด์ mid๋ช
์ ๋ฒํฐ์ง ๋ชปํ๋ ๋(= ์์๊ฐ ๋ ๋) ์ด
k๊ฐ ์ด์ ์ฐ์์ผ๋ก ๋ฑ์ฅํ๋ฉด โ ๊ฑด๋์ง ๋ชปํจ.
๋ฐฐ์ด์์ stones[i] - mid๋ฅผ ๊ณ์ฐํ ๋,
์ฆ, 0์ ๊ฑด๋ ์ ์์๋ ์ํ๋ค.
๋๋ฌธ์ ์กฐ๊ฑด์ ๋ฐ๋์ stones[i] - mid < 0 (์์) ๋ก ์ฒดํฌํด์ผ ํ๋ค.
public int solution(int[] stones, int k) {
int left = 1; //์ต์ ๊ฑด๋ ์ ์๋ ์น๊ตฌ์ ์
//์ต๋ ๊ฑด๋ ์ ์๋ ์น๊ตฌ์ ์ (stones์ ์ต๋๊ฐ)
int right = Arrays.stream(stones).max().getAsInt();
//left๊ฐ right๋ณด๋ค ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
while (left <= right) {
//์ค๊ฐ๊ฐ ์ค์
int mid = (left + right) / 2;
// mid๋ช
์ด ๋ชป ๊ฑด๋๋ฉด โ ์ธ์์๋ฅผ ์ค์ฌ์ผ ํจ
if(canCross(mid, stones, k) == -1) {
right = mid -1;
// mid๋ช
์ด ๊ฑด๋๋ฉด โ ๋ ๋ง์ด ๋ณด๋ผ ์ ์๋์ง ํ์ธ
} else {
left = mid + 1;
}
}
// right๋ โ๊ฐ๋ฅํ๋ ์ต๋ midโ๊ฐ ๋๋ค.
return right;
}
public int canCross(int mid, int[] stones, int k) {
// ์ฐ์์ผ๋ก ์์๊ฐ ๋๋ ๋ ๊ฐ์
int currStoneChain = 0;
for (int i = 0; i < stones.length; i++) {
// mid๋ช
์ ์น๊ตฌ๊ฐ ๋ฐ๊ณ ๋ ํ ์์ โ ๋ฐ์ ์ ์์
if (stones[i] - mid < 0) {
currStoneChain += 1;
//์ฐ์๋ ๋์ ์๊ฐ k ์ด์์ด๋ฉด ๊ฑด๋ ์ ์๋ค.
if (currStoneChain >= k) {
return -1;
}
} else {
//์ฐ์์ด ๋๊ธฐ๋ฉด ์ด๊ธฐํ
currStoneChain = 0;
}
}
//mid๋ช
์ ๊ฑด๋ ์ ์๋ค.
return 1;
}
โ๏ธ mid๋ช
์ ๋ณด๋ธ๋ค๊ณ ๊ฐ์ ํ๊ณ
โ stones ๋ฐฐ์ด์์ mid๋ฅผ ๋บ ๊ฒฐ๊ณผ๊ฐ ์์์ธ์ง ํ์ธํ๋ฉฐ
โ ์ฐ์๋ ์์ ๊ฐ์๊ฐ k ์ด์์ด๋ฉด ์คํจ
โ๏ธ ์ด ๊ณผ์ ์ ์ด๋ถํ์์ผ๋ก ๋ฐ๋ณต
โ ๊ฐ๋ฅ ์ฌ๋ถ๋ง ํ์ธํ๋ฉฐ ๋ฒ์๋ฅผ ์ขํ๊ฐ
โ๏ธ ๊ฒฐ๊ตญ ๊ฐ๋ฅํ ์ต๋ mid(right)๊ฐ ์ ๋ต
์ข
๋ฃ ์ง์ ์์ ์ ํญ์:
right = ๊ฑด๋ ์ ์์๋ ๊ฐ์ฅ ํฐ mid
left = ๊ฑด๋ ์ ์๋ ์ฒซ mid
์ฆ,
right๋ โ๊ฐ๋ฅํ ์ต๋ ์ธ์์โ์ด๊ณ
left๋ โ๋ถ๊ฐ๋ฅํ ์ต์ ์ธ์์โ๊ฐ ๋๋ค.
๊ทธ๋์ return ๊ฐ์ right.
๋ฌธ์ ์์๋ ๋์ ์๊ฐ 0์ด ๋๋ฉด ๊ฑด๋ ์ ์๋ค๊ณ ๋์ด ์๋๋ฐ ์ฝ๋์์๋
if (stones[i] - mid <= 0) {
์ด ์๋๋ผ
if (stones[i] - mid < 0) {
์ผ๋ก ํ ์ด์ ๋,
ํด๋น stones[i] - mid๋ mid๋ช
์ด ๋ฐ๊ณ ๋ ํ์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๊ณ ๋ ํ, ๋์ ์ซ์๊ฐ 0์ด ๋์๋ค๋ ๊ฒ์ ์ง๋๊ฐ ๋๋ ์์์๋ค๋ ์๋ฏธ์ด๊ธฐ ๋๋ฌธ์ ์ง๋๊ฐ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค.
์ฒ์์๋ ์กฐ๊ฑด์ ์๋์ ๊ฐ์ด ์ผ๋ค.
์๋์ ๊ฐ์ด ๋ฐฐ์ด์ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด, ๋ค์ ์ด๋ถํ์ ๋ ๋ฐฐ์ด์ด ๋ฌ๋ผ์ ธ์ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ๊ตฌํ์ง ๋ชปํ๋ค.
ํ๋ก๊ทธ๋๋จธ์ค์ ์์ 1๋ฒ์์๋ 1๋ฒ๋ง ๊ฒ์ฆ์ ํด๋ ๋ต์ด ๋์ค๊ธฐ ๋๋ฌธ์ ์์ ๋ ๋ง์ถ๋๋ฐ ๋ค๋ฅธ ํ ์คํธ์ผ์ด์ค๋ ๋ชจ๋ ํ๋ฆฌ๋ ๋ถ์์ฌ๊ฐ์๊ธด๋ค.
int result = stones[i] -= mid;
if (result < 0) {
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ์ง ๋ง๊ณ ์๋์ฒ๋ผ ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ฐ๋๋ก ํ์
if (stones[i] - mid < 0) {