프로그래머스: 배열의 유사도

Eden·2024년 12월 7일
1

TIL

목록 보기
64/92
post-thumbnail

문제 설명

두 배열이 얼마나 유사한지 확인하려고 합니다. 문자열 배열 s1s2가 주어질 때, 같은 원소의 개수를 반환하도록 solution 함수를 완성하세요.

제한사항

  • 1 ≤ s1, s2의 길이 ≤ 100
  • 1 ≤ s1, s2의 원소 길이 ≤ 10
  • s1, s2의 원소는 알파벳 소문자로만 이루어져 있습니다.
  • s1, s2는 각각 중복된 원소를 갖지 않습니다.

입출력 예

s1s2result
["a", "b", "c"]["com", "b", "d", "p", "c"]2
["n", "omg"]["m", "dot"]0

내가 푼 코드

import Foundation

func solution(_ s1: [String], _ s2: [String]) -> Int {
    var count = 0
    for i in s1 {
        for j in s2 {
            if i == j {
                count += 1
            }
        }
    }
    return count
}

문제점

  • 시간 복잡도 문제: 이중 for문을 사용해 모든 원소를 비교하므로 O(n²)의 시간 복잡도를 가진다. 배열의 크기가 커질수록 성능이 급격히 저하된다.
  • 비효율성: s1의 각 원소에 대해 s2를 전부 순회하기 때문에 불필요한 연산이 많다.

맞힌건 잘했어요 하지만 리팩하는 방법 찾아야겠띠용

1. Set을 활용한 교집합 리팩토링

배열을 집합(Set)으로 변환하고, 교집합을 구하여 공통 원소의 개수를 계산할 수 있다.

코드

import Foundation

func solution(_ s1: [String], _ s2: [String]) -> Int {
    let set1 = Set(s1)
    let set2 = Set(s2)
    return set1.intersection(set2).count
}

설명

  • Set(s1)Set(s2)로 배열을 집합으로 변환한다.
  • intersection 메서드를 사용해 두 집합의 교집합을 구한다.
  • 교집합의 개수를 반환한다.

장점

  • 효율적: 시간 복잡도가 O(n)으로, 이중 for문의 O(n²)보다 훨씬 빠르다고 한다.
  • 간결한 코드: 메서드를 활용해 직관적이고 읽기 쉬운 코드 작성이 가능하다.

2. Filter를 활용한 리팩토링

배열의 필터링과 contains 메서드를 활용해 공통 원소를 계산할 수 있다.

코드

import Foundation

func solution(_ s1: [String], _ s2: [String]) -> Int {
    return s1.filter { s2.contains($0) }.count
}

설명

  • filter 메서드를 사용해 s1의 각 원소 중 s2에 포함된 원소만 남긴다.
  • 남은 원소의 개수를 반환한다.

장점

  • 간단한 구현: 간단한 코드로 원하는 결과를 얻을 수 있다.
  • 적합성: 배열 크기가 작을 경우 효율적으로 사용할 수 있다.

배운 점

  • 문제를 해결하는 다양한 접근 방식을 시도하면서 각각의 장단점을 분석하는 것이 중요하다는 점을 배웠다.
  • Set은 중복 제거와 교집합 연산에 매우 효율적이며, 배열 처리에 유용한 도구라는 점을 알게 되었다.
  • 필터링 방식은 코드가 간결하지만, 데이터 크기가 클 경우 성능상의 단점이 있다는 것을 이해했다.
profile
Frontend🌐 and iOS

0개의 댓글