본문 바로가기

코딩테스트 스터디

코딩테스트 연습 - 배열의 유사도 (JAVA)

프로그래머스 코딩테스트 입문 0단계 문제입니다

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

 

📢 문제 설명

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

 

⭕ 정답 코드

1) List 사용

import java.util.*;
import java.util.stream.Collectors;
class Solution {
    public int solution(String[] s1, String[] s2) {
        int answer = 0;
        List<String> s2List = Arrays.stream(s2).collect(Collectors.toList());

        for(String s : s1)
            if(s2List.contains(s)) 
                answer++;
        
        return answer;
    }
}

🔍 해설

① 문자열 배열 s2을 stream을 사용해서 List로 변환한다

② s1 배열로 foreach 반복문을 돌면서

③ s2 문자열 리스트에 s1의 요소가 있으면 answer에 1씩 더해준다

 

 

2) HashSet 클래스 사용

import java.util.*;
import java.util.stream.Collectors;
class Solution {
    public int solution(String[] s1, String[] s2) {
        HashSet<String> set = new HashSet<>(Arrays.asList(s1)); //s1 배열로 해시셋 생성
        return (int)Arrays.stream(s2) //s2 배열로 Stream 생성
        	.filter(set::contains) //s2 데이터들 중 해시셋에 포함된 것만 남긴다
        	.count(); //필터링된 데이터들의 개수 카운팅
    }
}

🔍 해설

주석에 더 상세하게 설명해놨습니다

① 문자열 배열 s1으로 HashSet을 생성한다

② 문자열 배열 s2로 스트림을 생성한다

③ 스트림(s2)에서 해시셋(s1)에 있는 데이터만 남기게 필터링한다

④ 스트림에 남아있는 데이터들의 개수를 카운트해서 리턴한다

⑤ 스트림 count()의 반환형은 long이기 때문에 (int)로 형변환시켜준다

 

 

✅ 반성할 점

처음에는 이중for문으로 문제를 풀었다 (효율꽝)

문자열 List로도 contains() 메서드를 사용할 수 있다는 것과

HashSet이라는 데이터 클래스를 더 공부해야한다

 

 

📒 기억하고 갈 문법

1) 문자열 리스트에서도 contains를 할 수 있다!

문자열 리스트.contains("문자열"); //완전 가능

 

2) HashSet이란?

📖정의

  • Set 인터페이스에서 지원하는 구현 클래스
  • 순서대로 입력되지 않는다
  • 중복을 허용하지 않는다 (중요)

전혀 어려운 개념이 아니다!!!

필자는 이름만 보고 겁을 살.짝 먹었는데

전혀 어렵지 않다

 

핵심만 다시 말하자면

▶️ 배열, 리스트처럼 데이터를 넣을 수 있는 클래스

▶️ 그렇지만 배열처럼 순서가 정해져서 데이터가 삽입되진 않는다

▶️ HashSet의 제일 중요한 키워드는 "중복X"이다

▶️ 중복 없이 데이터를 넣을 수 있는 클래스라고 보면 된다

 

 

🚩선언하기

HashSet<String> set1 = new HashSet<String>();
HashSet<Integer> set2 = new HashSet<Integer>();

HashSet<데이터타입> 변수명 = new HashSet<데이터타입>();

 

🚩데이터 삽입/삭제

//삽입
set1.add(1);
set1.add(2);

set2.add("a");
set2.add("b");

//삭제
set1.remove(1);
set2.remove("a");

 

🚩데이터 검색

set2.contains("a"); //true or false

 


*참고 블로그: https://crazykim2.tistory.com/474 더 많은 정보는 이곳에서 확인하세요