[백준] 수 찾기(이진 탐색)

이찬혁·2024년 3월 29일

알고리즘

목록 보기
27/72

백준 온라인 저지 1920번 - 수 찾기

지난 이진 탐색 알고리즘 포스팅에서 공부한 것을 간단한 코딩 테스트 문제에 적용시켜 보았다.
인자로 받은 두 배열의 크기가 같다고 가정하고 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);
    }
}
profile
나의 개발로그

0개의 댓글