[개발] - 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
반응형