알고리즘

99클럽 코테 스터디 27일차 TIL Find The Original Array of Prefix Xor

ernest45 2024. 6. 15. 20:55

https://leetcode.com/problems/find-the-original-array-of-prefix-xor/description/

 

 

 

1. 문제 및 접근

 

 

2433. Find The Original Array of Prefix Xor

비트연산 xor

pref[0] = arr[0]

pref[1] = arr[0] ^ arr[1]

arr[1] = arr[0] ^ pref[1]

pref[2]=  arr[0]^arr[1]^arr[2]

arr[2] =  arr[0]^arr[1]^pref[2]

 

 

 

 

 

XOR ?

 

 

 

 

 

2.  풀이

 

public int[] findArray(int[] pref) {


    int arr[] = new int[pref.length];
    arr[0] = pref[0];

    int answer = arr[0];
    int now = arr[0];


    for (int i = 1; i < pref.length; i++) {


        arr[i] = now ^ pref[i];
        now = now ^ arr[i];



    }
    return arr;

}

 

 

 

xor의 분배법칙을 이용하면 된다고 한다.

(문제 자체가 생소해서 찾아봄)

 

pref[]의 배열이 주어질 때,

 

pref[i] = arr[0]^arr[1]^arr[2]^arr[i]로 이루어져있고,

 

0~i까지 xor 연산된 값이라는 뜻

 

문제에서 요구하는 것은 xor연산되기 전의 arr를 구하면 됨

 

 

 

 

 

 

 

 

2-1.  식 세우기

 

pref[0]  = arr[0]

pref[1]  = arr[0] ^ arr[1]

arr[1]    = arr[0] ^ pref[1]

pref[2] =  arr[0]^arr[1]^arr[2]

arr[2]   =  arr[0]^arr[1]^pref[2]

 

 

 

 

 

 

 

arr[]의 배열은 누적합을 구하기 위함

 

 

pref[0]의 값은 arr[0]이고,

 

 

현재 누적합의 수를 now로 지정

 

 

 

 

 

 

 

 

 

2-2. arr[i]값 구하기

 

 

 

arr[i]

 

분배법칙에 의해

 

{ pref[1]  = arr[0] ^ arr[1] }    =    {arr[1]    = arr[0] ^ pref[1]}

 

즉 이때까지 더해진 arr[i] 값들과 현재 pref[i]^ 연산의 값이다.

 

 

그리고 now에 다시 현재 arr[i]을 누적 시켜준다.

 

 

 

 

 

 

 

 

 

 

 

성공!

 

 

 

 

 

3.  마무리

 

 

^연산과 분배법칙을 보고, 쉽게 풀어낼 수 있었는데,

 

now 값을 잘못 계산해서 누적합으로 시작해줘야 하는데 0으로 초기화해서 시작한 작은 이슈가 있었다.

 

쉬운 수학문제라 차근히 식을 세워 나가면서 쉽게 접근할 수 있었다.

 

문제가 쉬워서 더 풀어봐야하지만,, 오늘은 주말이다 하루만..