2433. Find The Original Array of Prefix Xor
문제 설명
- 숫자 배열이 주어진다.
- 주어진배열은 원본배열에서
[i]^[i+1]
를 XOR 연산^
를 해서 만들어진 배열이다.- 역추적해서 구하라
문제 풀이
- 일단 XOR 연산에 대해서 설명을 간단히 하자면
5 -> 101 7 -> 111 5 ^ 7 -> 010 그니까 서로 다른것만 체크되는 것이다. 그렇게해서 나온 010 -> 2는 사실 이게 순서만 바꿔도 적용이 된다 5 ^ 7 -> 2 2 ^ 7 -> 5
- 이제 비밀을 알았으니 이걸 거꾸로 연선해나가면 될 것이다.
for i in stride(from: pref.count - 1, to: 0, by: -1) { answer.append(pref[i] ^ pref[i - 1]) }
역순으로 돌면서 만들어줘봤다.
3. 이렇게하면 정답배열은 아니고 [5,7,2,3,2] 가 나와야하는데, [2,3,2,7]이 등장한다. 이걸 이제
첫번째 원소값은 동일하게 적용되니pref[0]
을append
해준뒤,reverse()
하면 끝 !
최종 제출
class Solution {
func findArray(_ pref: [Int]) -> [Int] {
var answer = [Int]()
for i in stride(from: pref.count - 1, to: 0, by: -1) {
answer.append(pref[i] ^ pref[i - 1])
}
answer.append(pref[0])
answer.reverse()
return answer
}
}
타인의 코드
이게 쉬울수록 잘하시는 분의 코드는 남다른 것 같다.
class Solution {
func findArray(_ pref: [Int]) -> [Int] {
guard pref.count != 0 else { return [] }
return [pref[0]] + zip(pref.lazy.dropFirst(), pref.lazy.dropLast()).map { $0 ^ $1 }
}
}
zip으로 코드를 간소화
zip()
과 함께dropLast
,dropFirst
를 같이 써줌으로써 양 싸이드에서 점점 좁혀오는 구조를 만들 수 있다는것을 배웠다.
Lazy
- 변수의 값이 필요할 때까지 초기화하지 않고 실제로 사용될 때 초기화하도록 하는 메소드
메모리 효율적 사용 + 순환 참조 방지
다만, 아무데나 막 쓰면 멀티쓰레딩 환경에서 안전하지 않기때문에(thread-safe) 동기화 기법을 같이 사용해야 한다는 특이점이 있따고 한다!
또한 초기화 순서가 중요한 경우에는 처음 접근할 때 초기화되니까 이점 유의해서 사용할지 안할지도 잘 판단을 해줘야할 것이다.
출처