JAVA/코딩테스트
프로그래머스 레벨 1 - 코딩테스트 고득점kit 해쉬 : 폰켓몬[자바]
진짠
2024. 6. 12. 10:01
728x90
문제
난이도 : 레벨1
문제 :
- 폰켓몬을 가져갈 수 있는 최대 개수는 총 폰켓몬 / 2
- 같은 종류의 폰켓몬은 가져갈 수 없음
제한사항 :
- nums 배열에 폰켓몬의 종류가 1차원 배열로 담겨 있음.
- 1 <= nums <= 10,000 이며 항상 짝수
- 폰켓몬의 종류는 자연수 1~200,000
답
애초에 코딩테스트 공부를 거의 안하기도 했고 오랜만에 다시 공부하는 코딩테스트라 어떻게 풀어야 하는지 전혀 감이 잡히지 않았습니다.
배열을 순회하면서 원소들끼리 비교해서 다르다면 count++ 하는 방법을 생각했으나 포기했습니다.
(다른 사람의 풀이를 보니 sort를 통해 정렬한 후에 제가 생각한 방법대로 한 것을 보긴 했습니다. sort함수를 알고는 있었지만 거기까지 연결짓지 못했습니다.)
결국 풀이를 통해 HashSet와 중복 제거라는 키워드를 찾았고 그것을 토대로 문제를 풀 수 있었습니다.
import java.util.*;
class Solution {
public int solution(int[] nums) {
HashSet<Integer> pocketmon = new HashSet<Integer>();
int maxValue = nums.length / 2;
for(int num : nums) {
pocketmon.add(num);
}
if(maxValue < pocketmon.size()) {
return maxValue;
} else {
return pocketmon.size();
}
}
}
HashSet 생성 후 배열을 담았고 중복을 제거해주었습니다.
그리고 중복을 제거한 수가 최대값인 maxValue보다 클 경우에는 maxValue를 리턴하였고 작을 경우엔 중복을 제거한 수를 리턴해 주었습니다.
HashSet은 중요한 키워드인 만큼 자주 쓰일 법한 메소드를 정리해 보았습니다.
- remove(value) - 원하는 값을 삭제
- clear() - 전체삭제
- size() - 크기 구하기
- Iterator - HashSet의 값을 하나씩 값을 꺼내고 싶을때
ex) Iterator iter = set.iterator();
while(iter.hasNext()) {
// 값을 출력
}
다른 사람의 풀이
저의 지식으로 충분히 생각해 볼 법한 키워드였지만 생각하지 못한 것은 HashMap의 Key값이 고유하다는 점을 이용하여 Key 값에 폰켓몬의 종류 값을 넣어 중복을 제거하는 것이었습니다.
HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
for (int i = 0; i < nums.length; i++)
map.put(nums[i], 1);
...
이런 식으로 값을 넣으면 중복 또한 제거될 것입니다.
중복을 제거하거나 배열에서 특정 조건에 대한 값을 추출하고 싶을 때 해시 함수를 이용하면 좋겠다는 감을 잡을 수 있는 문제였습니다.
728x90