https://school.programmers.co.kr/learn/courses/30/lessons/1845
처음에는 해시 문제라고 생각해서 해시맵을 사용해서 풀려고 했다.
직접 코드를 짜보기보다는, 그림과 글로 문제 해결 방식을 생각해보고 감이 잡히면 코드를 만들어보려고 했다.
이것 조차도 안돼서 일단 해시맵을 구현부터 해봤지만 1시간 이상이 지나도 문제 해결에 대한 실마리조차 얻지 못했고 검색을 통해 해시셋이라는 것이 있다는 것을 알게 됐다.
옛날에 New Years test였나 거기에서 문제를 해결할 때 다른 사람들이 셋이라는 개념을 사용해 중복된 값을 제거해 문제를 돌리는 시간을 획기적으로 줄였다! 하는 답변을 많이 봤었는데 이 문제는 셋을 쓰는 개념인가보다
해시를 사용해야 한다고 하길래 해시를 저장하고 빈도수를 세는 데 사용하려고 했다
1. 숫자 n/2개를 배열에서 뽑는다
2. n/2개의 숫자 중 중복되지 않는 숫자의 개수를 구한다
3. 2에서 구한 중복되지 않는 숫자의 개수를 저장하는데 해시를 사용한다.
4. 저장해놓은 값에서 가장 큰 수를 구한다.
다만 이 방식의 치명적인 단점은, 3번의 개수의 저장은 아무리 생각해도 배열에 저장하는거지, 해시를 사용하는 방식은 아니었다.
해시란?
다시 얘기 하다 해시 맵과 맵과 차이점, 해시함수를 사용한다는 얘기 말고 구체적으로 또 어떤 점이 있을까 가설을 세워봤다.
[2 2 4 5 6 3]이라는 포켓몬이 있다고 가정한다.
1. for문을 돌며 숫자 세 개를 뽑아서 배열에 담아둔다(여기서 3중 중첩 for문이 생성될 수 밖에 없음) [[224], [225], [226], [223], [245], [246]]
2. 외부 배열의 인덱스를 키로, 내부 배열의 포켓몬의 개수를 해시값으로 설정한다.
3. 해시값을 for문을 돌며 가장 큰 값을 확인한다(해시 값이 n/2에 해당하는 경우 함수 종료)
for 문을 돌며 포켓몬을 n/2만큼 뽑는 과정이 너무 비효율적이라 포기
class Solution {
public int solution(int[] nums) {
int answer = 0;
int choosingNum = nums.length / 2;
HashSet<Integer> hashSet = new HashSet<Integer>();
for (int i: nums){
hashSet.add(i);
}
if(hashSet.size() >= choosingNum)
answer = choosingNum;
else
answer = hashSet.size();
return answer;
}
}
내 힘으로 해결하지 못해 슬프다.. 흑흑
문제의 핵심은 중복되지 않는 값을 구해서 그 숫자를 세는 것!