부분합 문제
문제링크
풀이 접근 (실패)
- 그냥 해시셋 2개로 투포인트 개념으로 문제를 풀면 해결할 수 있을거라고 생각했다.
- 근데 결과를 보니 최악의 케이스로 O(n^2) 까지 가는거 같아서 while문을 벗겨내서 문제를 푸는 방법을 생각해내야 했다.
구현 코드 (실패)
import java.util.HashSet;
class Solution {
public int solution(int[] topping) {
int answer = 0;
int len = topping.length;
int mid = 1;
while (len != mid) {
HashSet<Integer> set_1 = new HashSet<>();
HashSet<Integer> set_2 = new HashSet<>();
for (int i = 0; i < mid; i++) {
set_1.add(topping[i]);
}
for (int i = mid; i < len; i++) {
set_2.add(topping[i]);
}
if (set_1.size() == set_2.size()) {
answer++;
mid++;
} else if (set_1.size() > set_2.size()) {
break;
} else {
mid++;
}
}
return answer;
}
}
풀이접근
- 첫 시작을 set 자료구조에 넣어준다
- 두 번째는 hashMap 으로 각 숫자는 그대로 유지하고 각 원소의 갯수가 몇 개인지 세준다 이렇게 하면 size는 set과 똑같이 유지할 수 있다.
- 새로운 반복문을 통해 topping 에 하나를 추가할 때마다 어차피 set에서는 그대로 되지만 hashMap에서는 원소를 하나씩 줄여준다.
- 여기서 해당 원소에서 값이 0일 경우 키 값을 삭제해준다
- 위에 로직이 돌아간후 해시맵과 해시셋의 사이즈가 같을 경우 answer의 값을 하나 올려준다.
구현코드
import java.util.*;
class Solution {
public int solution(int[] topping) {
int answer = 0;
int size = topping.length;
HashSet<Integer> first = new HashSet<>();
HashMap<Integer, Integer> second = new HashMap<>();
first.add(topping[0]);
for (int i = 1;i < size; i++) {
second.put(topping[i], second.getOrDefault(topping[i], 0) + 1);
}
for (int i = 1;i < size; i++) {
first.add(topping[i]);
second.put(topping[i], second.get(topping[i]) - 1);
if (second.get(topping[i]) == 0) {
second.remove(topping[i]);
}
if (first.size() == second.size()) answer++;
}
return answer;
}
}
정리
- 제한 사항이 1,000,000 이였다면 O(n) 에서 끝내는 로직으로 갔어야 했는데 안일하게 생각해서 첫시도에서 성공하지 못 했다.
댓글남기기