[Swift] [43일차] 2657_LEET

·2025년 1월 19일
0

SwiftAlgorithm

목록 보기
46/105
post-thumbnail

2657. Find the Prefix Common Array of Two Arrays


문제 설명

  1. 길이 n 순열 2개
  2. 각 배열을 하나씩 집어넣을때 0인덱스부터.. 서로 가지고 있는 공통원소 갯수를 각인덱스별로 배열에 담아서 출력

A = [1,3,2,4] B = [3,1,2,4]
1. 인덱스 0 일때, Answer[0] = 0개다 (각각 1과 3을 갖고 있음)
2. 인덱스 1일때 Answer=[1] = 1,3, 2개다 각각 1,3을 가지고 있기 때문..
3....
이런식으로 해주면된다.


문제풀이

  1. 이거 어떻게 각각 가지고 있는걸 빠르게 탐색하지? 생각하다가
  2. 각 순열에대해서 빈 SET을 만들어주고,
  3. 교집합 구해주면 될 것 같다고 생각했다.

최종 제출

class Solution {
    func findThePrefixCommonArray(_ A: [Int], _ B: [Int]) -> [Int] {
        var setA: Set<Int> = []
        var setB: Set<Int> = []
        var LEN = A.count // 최대길이
        var answer = Array(repeating: 0, count: LEN) // 정답배열
        for i in 0 ..< LEN {
            setA.insert(A[i])
            setB.insert(B[i])
            answer[i] = setA.intersection(setB).count
        }

        return answer
    }
}

오잉? 좀 정석으로 풀었다 생각했는데 거의 꼴찌 runtime이여서 가장 빠르고 비율 높은 맨앞코드를 좀 알아봤다.

타인의 코드

class Solution {
    func findThePrefixCommonArray(_ A: [Int], _ B: [Int]) -> [Int] {
         var ans = [Int]()
        var eSet = Set<Int>()
        var count = 0
        for i in stride(from: 0, to: A.count, by: 1){
            if eSet.contains(A[i]){
                count += 1
            }else{
                eSet.insert(A[i])
            }

            if eSet.contains(B[i]){
                count += 1
            }else{
                eSet.insert(B[i])
            }

            ans.append(count)
        } 

        return ans  
    }
}
  1. Set을 하나만 사용하고, 조건문으로 공통 부분을 체크하면서 누적 카운트를 관리하는 방식이라 교집합 연산 없이 처리되기 때문에 훨씬 효율적이었다.
  2. 대신 조건문이 많아져 코드가 조금 복잡해 보일 수 있다는 점 정도가 장단이 있는 것 같았다.
profile
기억보단 기록을

0개의 댓글