코딩테스트/알고리즘 문제풀이

[JAVA][Codility] OddOccurrencesInArray

지과쌤 2022. 9. 30.
반응형

목차

    문제

    A non-empty array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired.

    For example, in array A such that:

    A[0] = 9 A[1] = 3 A[2] = 9 A[3] = 3 A[4] = 9 A[5] = 7 A[6] = 9

    • the elements at indexes 0 and 2 have value 9,
    • the elements at indexes 1 and 3 have value 3,
    • the elements at indexes 4 and 6 have value 9,
    • the element at index 5 has value 7 and is unpaired.

    Write a function:

    class Solution { public int solution(int[] A); }

    that, given an array A consisting of N integers fulfilling the above conditions, returns the value of the unpaired element.

    For example, given array A such that:

    A[0] = 9 A[1] = 3 A[2] = 9 A[3] = 3 A[4] = 9 A[5] = 7 A[6] = 9

    the function should return 7, as explained in the example above.

    Write an efficient algorithm for the following assumptions:

    • N is an odd integer within the range [1..1,000,000];
    • each element of array A is an integer within the range [1..1,000,000,000];
    • all but one of the values in A occur an even number of times.

    아이디어

    ArrayList와 HashSet에 각각 원소를 넣어두고, HashSet을 순회하며 해당 원소가 ArrayList 안에 몇개 들어있는지 체크.

     

    HashSet은 원소가 중복하여 존재할 수 없기 때문.

     

    하지만 해당 풀이는 시간복잡도가 O(N**2) 이므로 비효율적이다.

     

    효율적인 풀이는 다른 풀이 참고. 

    풀이

    import java.util.*;
    
    class Solution {
        public int solution(int[] A) {
            
            ArrayList<Integer> arr = new ArrayList<Integer>();
            Set<Integer> hashSet = new HashSet<Integer>();
            int result = 0;
    
            for(int i = 0; i<A.length; i++){
                arr.add(A[i]);
                hashSet.add(A[i]);
            }
    
            for (int val : hashSet){
                if(Collections.frequency(arr, val)%2 == 1){
                    result = val;
                    break;
                }
            }
    
            return result;
        }
    }

    다른 풀이

    보다 효율적인 풀이는 비트연산이 있다.

    XOR 비트연산을 하게되면, 비트가 다르면 1, 비트가 같으면 0 을 출력하게 되는데, 짝이 없는 수만 최종적으로 남게 되어 출력되게 된다.

     

    시간복잡도는 O(N) or O(N*log(N))이다.

    이렇게까지 해야되나 싶다.

    class Solution {
        public int solution(int[] A) {
            int result = 0;
            for(int i : A){
                result ^= i;
            }
            return result;
        }
    }
    반응형

    '코딩테스트 > 알고리즘 문제풀이' 카테고리의 다른 글

    [JAVA] 392. Is Subsequence  (0) 2022.10.12
    [JAVA] 205. Isomorphic Strings  (0) 2022.10.06
    [JAVA][Codility] CyclicRotation  (0) 2022.09.30
    [JAVA] 338. Counting Bits  (0) 2022.09.21
    [JAVA] 70. Climbing Stairs  (0) 2022.09.19

    댓글

    💲 추천 글