지난 이진 탐색 알고리즘 포스팅에서 공부한 것을 간단한 코딩 테스트 문제에 적용시켜 보았다.
인자로 받은 두 배열의 크기가 같다고 가정하고 while문 로직과 같이 이진 탐색 알고리즘을 적용하여 배열 중간의 값을 구한 후 그 값과 구하려는 값이 일치할경우 1, while문 동안 일치하지 않을 경우는 0을 answer 배열에 넣어주었다.
FindNum.java
package com.example.Baekjoon;
import java.util.Arrays;
public class FindNum {
public int[] binarySearch(int[] originArr, int[] targetArr) {
// 이진 탐색을 하기 위해 오름차순 정렬
Arrays.sort(originArr);
int[] answer = new int[originArr.length];
for (int i = 0; i < originArr.length; i++) {
int startIdx = 0;
int endIdx = originArr.length - 1;
boolean find = false;
int curIdx = i;
while (startIdx <= endIdx) {
int midIdx = (startIdx + endIdx) / 2;
int midValue = originArr[midIdx];
// 중간 값보다 찾으려는 값이 작을 경우
if (midValue > targetArr[i]) {
endIdx = midIdx - 1;
// 중간 값보다 찾으려는 값이 클 경우
} else if (midValue < targetArr[i]) {
startIdx = midIdx + 1;
} else {
find = true;
break;
}
}
if (find) {
answer[curIdx] = 1;
} else {
answer[curIdx] = 0;
}
}
return answer;
}
}
FindNumTest.java
package com.example.Baekjoon;
import static org.junit.Assert.assertArrayEquals;
import org.junit.Test;
public class FindNumTest {
@Test
public void testFindNum() {
FindNum fn = new FindNum();
int[] originArr = { 4, 1, 5, 2, 3 };
int[] targetArr = { 1, 3, 7, 9, 5 };
int[] result1 = fn.binarySearch(originArr, targetArr);
int[] expected = { 1, 1, 0, 0, 1 };
assertArrayEquals(expected, result1);
}
}