[Java] ํฌํฌ์ธํฐ | ๋ฐฑ์ค 1253 ์ข๋ค
https://www.acmicpc.net/problem/1253
์ ๊ทผ ๋ฐฉ๋ฒ
ํฌํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์์ ํฉ์ ๊ตฌํ๊ณ ๊ทธ ํฉ์ด ํ๊ฒ๊ณผ ์ผ์นํ๋์ง๋ฅผ ํ์ธ
์ด๋ฅผ ์ํด ๋ฐฐ์ด์ ์ ๋ ฌ์ด ์ ํ๋์ด์ผ ํจ
Arrays.sort(arr);
int count = 0;
for(int i=0; i<arr.length; i++){
if(isGoodNumber(arr[i], i))
count++;
}
๋ฐฐ์ด ์ ๋ ฌ ์ดํ ํด๋น ํ๊ฒ ๋๋ฒ๊ฐ ๋ฐฐ์ด ๋ด์ ๋์์ ํฉ์ผ๋ก ๋ง๋ค ์ ์๋ ์(์ข์ ์)์ธ์ง ํ์ธํ๋ isGoodNumber(int target, int target_idx) ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ข์ ์์ผ ๊ฒฝ์ฐ(true) count++ํ์ฌ ์ข์ ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
isGoodNumber ๋ฉ์๋ ๊ตฌํ
๋จ์ํ ๋ฐฐ์ด ๋ด์ ๋ ์๊ฐ ๋ฐฐ์ด ๋ด์ ํ๊ฒ ๊ฐ๊ณผ ์ผ์นํ๋ ์ง๋ง ํ์ธํ๋ค๋ฉด, ๋์์ ํฉ์ด ํ๊ฒ ๊ฐ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ return true, ํ๊ฒ ๊ฐ ๋ณด๋ค ํด ๊ฒฝ์ฐ right ํฌ์ธํฐ 1 ๊ฐ์,ํ๊ฒ ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ left ํฌ์ธํฐ 1์ฆ๊ฐ์ํค๋ฉฐ ํ์ธํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ left๋ right ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์ ํ๊ฒ๊ฐ์ด ์๋ค๋ฉด ํ๊ฒ ๊ฐ์ด ๋ค๋ฅธ ๋ ์์ ํฉ์ผ๋ก ๋ํ๋ด์ผํ๋ค๋ ์กฐ๊ฑด์ ๋ง์กฑ์ํค์ง ๋ชปํ๋ค.
์ฆ, ํ๊ฒ ๊ฐ์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ฉด ์๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ์ง ์ํด, leftํฌ์ธํฐ์ right ํฌ์ธํฐ๊ฐ ํ๊ฒ ๊ฐ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์ฒดํฌํ๋ค.
๋ง์ฝ left ํฌ์ธํฐ๊ฐ ํ์ผ์ ๊ฐ๋ฆฌํค๊ณ ์์ ๊ฒฝ์ฐ left++ ํ continue, right ํฌ์ธํฐ๊ฐ ํ๊ฒ์ ๊ฐ๋ฆฌํฌ ๊ฒฝ์ฐ right--ํ continue ์ฒ๋ฆฌํ๋ค.
์ด๋ฅผ ํตํด ํ๊ฒ์ ์ ์ธํ ๋์์ ํฉ์ด ํ๊ฒ ๊ฐ๊ณผ ๊ฐ์์ ๋ณด์ฅํ ์ ์๋ค.
private static boolean isGoodNumber(int target, int target_idx){
int left = 0; int right = N-1;
while(left < right){
if(left == target_idx){
left++;
continue;
}
if(right == target_idx){
right--;
continue;
}
int currentSum = arr[left] + arr[right];
if(currentSum == target)
return true;
if(currentSum > target){
right--; continue;
}
left++;
}
return false;
}
์ด ๋ฌธ์ ๊ฐ ๋ฎ์ ์ ๋ต๋ฅ ๊ณผ ์๊ฐ๋ณด๋ค ๋์ ๋์ด๋๋ก ํ๊ฐ๋๋ ์ด์ ๊ฐ ์์ํ ๋ฐ ์์ง ์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค. ๋ญ๊ฐ ์ฝ๊ฒ ํ๋ ค ์ข ์ฐ์ฐํด ๋ค๋ฅธ ์ฌ๋๋ค์ ์ง๋ฌธ๋ค์ ์ฐพ์๋ณด๊ณ ๋ด๊ฐ ๊ณ ๋ฏผํ์ง ์์๋ ๋ถ๋ถ์ ์์๋ด์ผ๊ฒ ๋ค.