프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 배열의 유사도(Java)

Sigfriede 2023. 3. 29. 20:04

  문제 설명

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

 

  제한사항

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

 

  입출력 예

s1 s2 result
["a", "b", "c"] ["com", "b", "d", "p", "c"] 2
["n", "omg"] ["m", "dot"] 0
import java.util.Arrays;

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

  이 문제는 각 배열의 원소끼리 비교하여 얼마나 같은지를 확인하고 싶어 합니다. 원소를 쪼개서 확인하지는 않아도 됩니다. 그러므로 이중 for문으로 각각 s1과 s2를 순회하게 합니다. 이후 if문을 통해 s1의 i번째 원소와 s2의 j번째 원소가 같은지 확인합니다.

  equals의 개념을 잡아보기 위한 설명을 해보자면(제가 헷갈려서!), equals는 '==(동등 연산자)'와 비슷한 쓰임새에 사용됩니다. 둘의 가장 큰 차이로는 equals는 값의 비교, ==는 주소의 비교입니다. 따라서 equals는 비교하고 싶은 대상의 값이 같다면 true를 반환하지만, ==의 경우 값이 같다고 하더라도 각각 다른 객체로 생성되었다면 false를 반환하는 것입니다.

 

String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");

System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));

true
false
true

 

  위의 예시에서는 s1과 s2, s1과 s3을 각각 비교하고 있습니다. 앞선 설명을 바탕으로 대입해보겠습니다.

  s1과 s2의 동등 연산자의 결과는 true입니다. s1에 생성된 값과 s2에 생성된 값은 "Hello"라는 같은 주소(객체)를 가리키고 있기 때문입니다. 그러나 s1과 s3의 결과는 false가 나왔습니다. s3은 기존에 생성된 문자열 "Hello"가 아닌, new String을 통해 "Hello"라는 새로운 객체를 만들었기 때문입니다. 따라서 다른 객체라고 판단한 동등 연산자는 false를 반환한 것입니다.

  그러나 s1과 s3을 equals로 비교하면 true를 반환합니다. equals는 객체 비교가 아닌, 값만을 비교하기 때문입니다. 따라서 순수한 값끼리의 비교를 원한다면 equals를 써야합니다. 간단한 코드라면 어떤 것을 쓰더라도 비슷한 결과값을 도출하겠지만, 만약 본인이 확실한 결과를 원한다면 쓰임을 분명히 구분할 필요는 있겠습니다.

  혹시 틀린 설명이 있을 수 있습니다! 틀린 부분은 댓글을 통해 알려주시면 정말정말 감사할 것 같습니다.