본문 바로가기
Java

[Java] 배열에 특정 값 존재(포함)여부 체크

by jn4624 2022. 3. 19.
반응형

1. for문

- 반복문을 통해 배열의 요소를 순회, 요소와 key값을 하나씩 비교하며 key값과 일치하는 값이 존재하는지 확인한다.

public void solutionFor() {
    int[] lottos = {44, 1, 0, 0, 31, 25};
    int[] win_nums = {31, 10, 45, 1, 6, 19};
    int prize_count = 0;
    
    for( int lotto : lottos )
    {
        for( int win_num : win_nums )
        {
            if( lotto == win_num )
            {
                prize_count++;
                break;
            }
        }
    }
    
    System.out.println(Math.min(7-prize_count, 6));
}

2. binarySearch()

- 이진탐색 메서드를 사용해 정렬된 배열에서 key값을 검색한다.

key값 검색에 성공하면 해당 값이 존재하는 위치(index >= 0)를 반환하고, key값 검색에 실패하면 삽입 포인트(index < 0)를 반환한다.

*삽입위치(inertion point): 배열에 key값이 삽입된다면 어느 위치(index)에 들어와야 할지 알려준다. 탐색 실패시 음수값을 반환하는데 이 음수값을 -(index)-1하면 양수 삽입 위치를 알 수 있다.

binarySearch() 메서드는 반드시 정렬된 배열에 사용해야 한다.

이진탐색 배열요소-key값과의 대소비교를 통해 탐색 범위를 줄여나가기 때문에 정렬되지 않은 배열에 사용하면 기대한 결과와 다르게 이상한 값이 반환된다.

public void solutionBinarySearch() {
    int[] lottos = {44, 1, 0, 0, 31, 25};
    int[] win_nums = {31, 10, 45, 1, 6, 19};
    int prize_count = 0;
    
    Arrays.sort(lottos);
    Arrays.sort(win_nums);
    
    for( int lotto : lottos )
    {
        if( Arrays.binarySearch(win_nums, lotto) >= 0 )
        {
            prize_count++;
        }
    }
    
    System.out.println(Math.min(7-prize_count, 6));
}

3. anyMath()

- Arrays.stream(int[] array) 메서드를 사용하여 int 배열을 IntStream으로 변경한 후,

.anyMatch() 메서드를 사용해 요소 중에서 key값과 일치하는 값이 존재하는지 여부(true/false)를 확인한다.

public void solutionAnyMath() {
    int[] lottos = {44, 1, 0, 0, 31, 25};
    int[] win_nums = {31, 10, 45, 1, 6, 19};
    int prize_count = 0;
    
    for( int lotto : lottos )
    {
        if( Arrays.stream(win_nums).anyMatch(i -> i == lotto) )
        {
            prize_count++;
        }
    }
    
    System.out.println(Math.min(7-prize_count, 6));
}

4. contains()

- Arrays.asList() 메서드를 사용하여 배열을 List로 변경한 후,

contains() 메서드를 사용하여 리스트 내 요소 중에 key값이 존재 여부를 확인한다.

public static int solutionContains() {
    Integer[] lottos = {44, 1, 0, 0, 31, 25};
    Integer[] win_nums = {31, 10, 45, 1, 6, 19};
    int prize_count = 0;
    
    for( Integer lotto : lottos )
    {
        if( Arrays.asList(win_nums).contains(lotto) )
        {
            prize_count++;
        }
    }

    System.out.println(Math.min(7-prize_count, 6));
}
 

리스트화할 배열이 int[] 타입이고 key값이 int 타입일 경우 제대로 작동 안할 수 있다.

Arrays.asList()로 배열을 리스트화 할 때 List<T> asList(T...) 메서드의 제네릭스에 int[] 타입이 그대로 전달되어 List<int[]>와 같이 int[] 타입으로 리스트화 되어 버리기 때문이다.

(우리가 원한건 List<int>) 그래서 int[] 배열을 asList<T...>로 리스트화 한 다음 contains(int key)를 수행하게 되어버리면 '{1, 2, 3, 4} == 3'과 같이 배열 자체와 int값이 비교되어버려 무조건 false를 반환한다.

 

 

전달 인자 asList() 기대 반환값 asList() 실제 반환값
int[] array List<int> List<int[]>
Integer[] array List<Integer> List<Integer>

 

 

🙏 참조 ::

반응형