본문 바로가기

Study/Code Review

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

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120903

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

01. 나의 풀이 코드

class Solution {
    public int solution(String[] s1, String[] s2) {
        int answer = 0;
        
        for (int i = 0; i < s1.length; i++) {
            for (int j = 0; j < s2.length; j++) {
                if (s1[i].equals(s2[j])) {
                    answer++;
                }
            }
        }
        return answer;
    }
}


// 1차로 작성했던 코드
   int len = s1.length > s2.length? s1 : s2;

    // 배열의 각 요소를 비교
    for (int i = 0; i < len; i++) {
        if (s1[i].equals(s2[i])) {
            count++;
        }
    }

 

 

배열의 길이가 다르기 때문에 루프 돌려야 하는 길이를 어떻게 할까 하다가 아래처럼 길이를 써봤지만, 테스트 시나리오에서 1개만 통과되었기 때문에 이중 for문을 사용했다.

 

 


 

그러다가 길이가 다른 두 배열에서 교집합만 뽑아 내는 코드는 없을까 해서 챗gpt 한테 물어본 코드는 이러했다.

 

import java.util.HashSet;
import java.util.Set;

public class ArrayIntersection {
    public static void main(String[] args) {
        // 예시 배열들
        String[] array1 = {"apple", "banana", "cherry", "apple"};
        String[] array2 = {"banana", "apple", "date", "cherry"};

        // 교집합을 저장할 Set
        Set<String> intersection = new HashSet<>();

        // 첫 번째 배열의 요소들을 Set으로 변환
        Set<String> set1 = new HashSet<>();
        for (String s : array1) {
            set1.add(s);
        }

        // 두 번째 배열의 요소들을 하나씩 비교하여 교집합 찾기
        for (String s : array2) {
            if (set1.contains(s)) {
                intersection.add(s);
            }
        }

        // 교집합 출력
        System.out.println("교집합: " + intersection);
    }
}

 

 

Java에서 Set은 분리된 요소를 허용하지 않는, 교집합을 구하는 데 적합하다고 한다.

 


1. **`Set` 사용**: `Set`은 중복된 요소를 허용하지 않기 때문에 교집합을 구하는 데 적합합니다. `HashSet`을 사용하여 배열의 요소를 저장하고 비교합니다.

2. **첫 번째 배열의 요소들을 `Set`에 추가**: `array1`의 모든 요소를 `set1`에 추가합니다. 이렇게 하면 중복된 요소 없이 배열의 모든 요소가 `set1`에 저장됩니다.

3. **교집합 찾기**: `array2`의 요소를 하나씩 순회하면서, 그 요소가 `set1`에 존재하는지 확인합니다. 존재한다면, `intersection`이라는 교집합을 저장할 `Set`에 추가합니다.

4. **결과 출력**: 최종적으로 `intersection`에는 두 배열 간의 교집합이 저장되며, 이를 출력합니다.

### 실행 결과:
주어진 예시에서 배열 `array1`과 `array2`의 교집합은 `"apple", "banana", "cherry"`가 됩니다. 따라서 출력은 다음과 같습니다:


교집합: [banana, cherry, apple]


이 코드는 길이가 다른 두 배열에서도 제대로 작동하며, 두 배열의 공통된 요소들을 찾아낼 수 있습니다.