새소식

Programmers Coding Test/Java

[프로그래머스 120903] Java - 코딩테스트 입문 / 배열의 유사도

  • -

 

 

배열의 유사도

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

1)  문제

두 배열이 얼마나 유사한지 확인해보려고 합니다. 
문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ s1, s2의 길이 ≤ 100
1 ≤ s1, s2의 원소의 길이 ≤ 10
s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다
s1과 s2는 각각 중복된 원소를 갖지 않습니다.

 

 

 

2)  예시

 

 

Result Table
s1 s2 result
["a", "b", "c"] ["com", "b", "d", "p", "c"] 2
["n", "omg"] ["m", "dot"] 0

 

 

 

입출력 예 #1
"b"와 "c"가 같으므로 2를 return합니다.


입출력 예 #2
같은 원소가 없으므로 0을 return합니다.

 

 

 

3)  풀이

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 문자열 배열 s1과 s2을 매개변수로 하는 solution 메소드를 선언합니다.

solution은 정수를 반환하므로 데이터타입을 int로 합니다.

●  public int solution(String[] s1, String[] s2) {

 

 

 

 

3. 제한사항을 확인하고, 만족하지 않을 경우 예외처리합니다.

●     if(s1.length < 1 || s1.length > 100 || s2.length <1 || s2.length > 100){
            throw new IllegalArgumentException("s1 및 s2의 길이는 1 이상 100 이하입니다.");
        }
        

 

 

 

4. 두 문자열 배열이 가지는 같은 원소의 수인 변수 answer를 생성하고 초기화해줍니다.

  int answer = 0;

 

 

 

5. for반복문을 통해 s1의 원소와 s2의 원소를 순회하며 equal 메소드를 이용하여 동일 여부를 확인합니다.

두 원소가 같다면 answer 값을 1 증가시킵니다.

모든 순환이 마치면 최종적으로 answer를 반환합니다.

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

 

 

 

 

 

 

 

 

4)  코드

 

class Solution {
    public int solution(String[] s1, String[] s2) {
        if(s1.length < 1 || s1.length > 100 || s2.length <1 || s2.length > 100){
            throw new IllegalArgumentException("s1 및 s2의 길이는 1 이상 100 이하입니다.");
        }
                
        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;
    }
}

 

 

 

 

 

 

 

5)  느낀점

equal로 동일한지 여부를 확인하는 방법 외에 어떤 방법이 또 있을지 다른 사람 코드를 참고해보았습니다.

 

import java.util.HashSet;

class Solution {
    public int solution(String[] s1, String[] s2) {
        HashSet<String> set2 = new HashSet<>();
        for (String str : s2) {
            set2.add(str);
        }

        int count = 0;
        for (String str : s1) {
            if (set2.contains(str)) {
                count++;
            }
        }

        return count;
    }
}

 

HashSet이라는 검색에 유용한, 그리고 중복된 원소를 허용하지 않는 자료구조로 s2를 변환하고,

그 s2에 콜렉션 인터페이스 중 하나인 contains 메소드를 이용해 s1을 포함하고 있는지 여부를 확인하고
count를 증가시키는 방식이었습니다.

 

HashSet을 사용하면, HashSet을 저장하기위한 추가적인 메모리가 필요하지만 검색 속도가 빠르고,

나의 코드처럼 이중반복문을 사용하면 메모리적인 측면에서는 이득을 보지만 코드가 복잡해질수도 있으니

지금은 단순 알고리즘 문제풀이지만 실제 상황을 마주한다면,

적절한 방법을 택하기 위해 고민해야할 것으로 느껴졌습니다.

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.