문제 설명

민규와 지수는 구슬 맞추기 게임을 하려고 합니다. 게임의 방식은 다음과 같습니다.

   · 숫자가 적힌 구슬이 한 쌍씩 들어있는 주머니가 있습니다.

  · 각 구슬 쌍에는 같은 숫자가 적혀있습니다. 즉, 주머니에는 같은 숫자를 가진 구슬은 2개씩 있습니다.

  · 술래는 주머니에서 상대가 알지 못하게 하나의 구슬을 빼내거나, 빼내지 않습니다.

  · 그런 후 상대는 주머니에 담긴 구슬을 살펴보고, 술래가 주머니에서 구슬을 빼냈는지 여부와 빼냈다면 그 구슬의 숫자를 맞추는 게임입니다.

 

주머니 안에 들어있는 구슬에 적힌 숫자 정수 배열 arr가 주어질 때, 술래가 빼낸 구슬의 번호를 출력하는 프로그램을 구현하세요.

단, 술래가 구슬을 빼내지 않았다면 0을 출력하세요.


입력 형식

· arr : 주머니에 담긴 구슬의 번호가 적힌 정수 배열


출력 형식

· 술래가 빼간 구슬의 번호를 정수로 반환


제약 사항

· 1 <= arr.length <= 10000

· 1 <= arr[i] <= 100000


입출력 예시

·  예시1

  · 입력

      · arr = {1, 2, 1}

  · 출력 : 2

  · 설명 : 술래가 숫자 2가 적힌 구슬 쌍 중 하나를 빼간 상황이다.

 

· 예시2

  · 입력

      · arr = {44, 22, 33, 22, 44, 33}

  · 출력 : 0

  · 설명 : 술래가 구슬을 빼가지 않은 상황이다.


작성 코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

public class Solution224 {
    public int solution(int[] arr) {
        HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();
        for (int i = 0; i < arr.length; i++) {
            if (map.containsKey(arr[i])) {
                map.get(arr[i]).add(i);
            } else {
                ArrayList<Integer> indices = new ArrayList<>();
                indices.add(i);
                map.put(arr[i], indices);
            }
        }
        for (int i = 0; i < arr.length; i++) {
            if (map.get(arr[i]).size() == 1) {
                return arr[i];
            }

        }
        return 0;
    }

    public static void main(String[] args) {
        Solution224 st = new Solution224();
        int[] arr = {1, 2, 1};
        System.out.println(Arrays.toString(new int[]{st.solution(arr)}));
        int[] arr2 = {44, 22, 33, 22, 44, 33};
        System.out.println(Arrays.toString(new int[]{st.solution(arr2)}));
    }
}

위 코드는 점수는 통과했는데 중간 과정에서 해석을 잘 못하겠음

정답 코드로 이해하고 넘어가자

 

정답 코드

import java.util.Arrays;

class Solution {
    public int solution(int[] arr) {
    	// 배열의 길이가 짝수이면 빠진 짝 숫자가 없는 것으로 0을 반환
        if (arr.length % 2 == 0) {
            return 0;
        }
        return Arrays.stream(arr)
                .reduce((x, y) -> x ^ y) // 배열에 있는 모든 값을 XOR 연산으로 결합
                .getAsInt();
    }

    public static void main(String[] args) {
        Solution st = new Solution();
        int[] arr = {1, 2, 1};
        System.out.println(Arrays.toString(new int[]{st.solution(arr)}));
        int[] arr2 = {44, 22, 33, 22, 44, 33};
        System.out.println(Arrays.toString(new int[]{st.solution(arr2)}));
    }
}