[Swift] [70일차] 2433_LEET LAZY?란 ?

·2025년 2월 15일
0

SwiftAlgorithm

목록 보기
73/105
post-thumbnail

2433. Find The Original Array of Prefix Xor


문제 설명

  1. 숫자 배열이 주어진다.
  2. 주어진배열은 원본배열에서 [i]^[i+1]를 XOR 연산 ^를 해서 만들어진 배열이다.
  3. 역추적해서 구하라

문제 풀이

  1. 일단 XOR 연산에 대해서 설명을 간단히 하자면
5 -> 101
7 -> 111   
5 ^ 7 -> 010  그니까 서로 다른것만 체크되는 것이다. 
그렇게해서 나온 010 -> 2는 사실 이게 순서만 바꿔도 적용이 된다
5 ^ 7 -> 2    
2 ^ 7 -> 5
  1. 이제 비밀을 알았으니 이걸 거꾸로 연선해나가면 될 것이다.
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 이거 뭐지?

Lazy - 변수의 값이 필요할 때까지 초기화하지 않고 실제로 사용될 때 초기화하도록 하는 메소드
메모리 효율적 사용 + 순환 참조 방지

lazy로 선언된 변수는 처음 접근할 때 초기화됩니다. 이전에는 메모리에 할당되지 않는거라서, 큰 데이터 쓸때 사용한다고 한다.

다만, 아무데나 막 쓰면 멀티쓰레딩 환경에서 안전하지 않기때문에(thread-safe) 동기화 기법을 같이 사용해야 한다는 특이점이 있따고 한다!
또한 초기화 순서가 중요한 경우에는 처음 접근할 때 초기화되니까 이점 유의해서 사용할지 안할지도 잘 판단을 해줘야할 것이다.


출처

[Swift / Lazy] 진짜 필요할 때만 씁시다!

profile
기억보단 기록을

0개의 댓글