코드 그라데이션
[Lv.0] 배열의 유사도 본문
배열의 유사도
https://school.programmers.co.kr/learn/courses/30/lessons/120903
문제 설명
두 배열이 얼마나 유사한지 확인해보려고 합니다.
문자열 배열 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
'Java > 알고리즘' 카테고리의 다른 글
[Lv.0] 뒤에서 5등 위로 (0) | 2023.06.08 |
---|---|
[Lv.0] 접두사인지 확인하기 (0) | 2023.06.08 |
[Lv.0] 점의 위치 구하기 (1) | 2023.06.07 |
[Lv.0] (2문제) 공배수, n의 배수 (0) | 2023.06.07 |
[Lv.0] (2문제) 문자열을 정수로 변환하기, 문자열로 변환 (0) | 2023.06.07 |
Comments