코드 그라데이션

[Lv.0] 배열의 유사도 본문

Java/알고리즘

[Lv.0] 배열의 유사도

완벽한 장면 2023. 6. 8. 00:11

배열의 유사도

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

두 배열이 얼마나 유사한지 확인해보려고 합니다. 

문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

 

입출력 예

입출력 예 설명

 

아이디어

  • 단순하게 생각하면 s1의 원소 하나를 가지고 s2를 쭉 돌면서 s1의 원소와 일치하는 것이 있는지를 찾는다.
  • 만약 일치하면 result에 하나씩 검사하고, 그리고 그 다음에 s1의 두 번째 원소로 넘어가서 동일한 과정을 반복한다.
  • for문은 이중for문으로 써주는 게 바람직하다. s1도 돌아야 하고 s2도 돌아야 하니까.
  • 그리고 여기서는 s1과 s2의 길이 대소는 알 수 없다. 단순히 조건만 주어져 있음.
  • 어차피 매핑을 하는 거니까 기준은 어떤 것이 되도 상관 없을 듯.
  • 문자열이니까 비교는 == 가 아니라 equals 사용하자.
  • 중첩 for문은 반복하고 싶은 대상의 반복문이다.
  • 같은 것을 찾는 거니까 자료구조 이용해서도 찾을 수 있지 않을까? 

예를 들어 List에 있는 데이터를 찾고 싶다면, 리스트에 들어있는 데이터를 찾는데 시간은 얼마나 필요할까??

- 리스트의 길이만큼 필요할 것이다.

 

여기서 그래서 좀 더 쉽게 해결할 수 있는 방법은  값을 Map의 key로 넣거나, Set에다가 넣어서 비교.

 

이 문제에 적용해보면, s2가 배열이니까 얘를 먼저 Set에다가 다 집어넣는다.(한 번의 반복을 통해)

다음으로 s1을 반복하면서, Set에서 제공하는 contains()를 통해 s2.contains(s1[0]) 이런식으로 찾는다.

이게 가능한 이유는 문제에서 중복된 원소를 허용하지 않기 때문에.

 

작성 코드

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;
    }
}

 

개선한 코드

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

class Solution {
    public int solution(String[] s1, String[] s2) {
        int answer = 0;
        Set<String> set = new HashSet<>();

        for (String str : s2) {
            set.add(str);
        }

        for (String str : s1) {
            if (set.contains(str)) {
                answer++;
            }
        }

        return answer;
    }
}
728x90
Comments