[문제]
당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.
1. 첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
2. 첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
3. 첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
4. 두 번째(1번), 세 번째(2번) 폰켓몬을 선택
5. 두 번째(1번), 네 번째(3번) 폰켓몬을 선택
6. 세 번째(2번), 네 번째(3번) 폰켓몬을 선택
이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다. 따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.
[제한사항]
nums는 폰켓몬의 종류 번호가 담긴 1차원 배열입니다.
nums의 길이(N)는 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다.
폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다.
가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도, 선택할 수 있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다.
[Algorithm]
1. 반복문(for문)을 통해 중복 제거
➡️ 폰켓몬 종류의 개수를 파악하는 과정
2. HashSet에 저장
⭐️ Set 인터페이스는 중복을 허용하지 않기 때문에 반복문을 통해 중복 제거가 가능한 것 !!
3. 개수 비교 후, nums 배열의 1/2 보다 폰켓몬의 종류가 많으면 nums.length의 1/2을 return
그렇지 않으면 HashSet의 size를 return
[Code]
import java.util.HashSet;
class Solution {
public int solution(int[] nums) {
// HashSet 선언
HashSet<Integer> set = new HashSet<Integer>();
// 반복문을 통해 중복 제거 -> 폰켓몬 종류 숫자 알 수 있음
for (int i=0; i < nums.length; i++) {
int k = nums[i];
set.add(k);
}
// set에 저장된 폰켓몬 종류 개수 비교 후 결과값 return
if(set.size() >= nums.length/2) {
return nums.length/2;
} else {
return set.size();
}
}
}
[+ Plus]
⭐️ HashSet
- 중복된 값 허용 x
- 순서 보장 x
- null을 값으로 허용 O
[+ 다른 사람 풀이]
1. ArrayList를 활용한 풀이
import java.util.*;
class Solution {
public int solution(int[] nums) {
//1. 기존 length를 구한다.
//2. 중복값을 제거한 length를 구한다.
//3. 두 값중 최소값이 정답.
List<Integer> list = new ArrayList<Integer>();
for(int i = 0 ; i < nums.length; i++){
if(!list.contains(nums[i])){
list.add(nums[i]);
}
}
return nums.length/2 > list.size()?list.size():nums.length/2;
}
}
2. HashMap을 활용한 풀이
(굳이 map을 사용할 이유는 모르겠긴함)
import java.util.HashMap;
class Solution {
public int solution(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
for (int i = 0; i < nums.length; i++)
map.put(nums[i], 1);
return map.size() > nums.length / 2 ? nums.length / 2 : map.size();
}
}
return을 return Math.min(map.size(), nums.length / 2); 로 하는게 더 깔끔하다는 댓글 댑악 ㅋ
근데 HashMap으로 했을 때의 장점을 아직 모르겠다
이 문제는 HashSet이 더 낫지 않나?!
그래서 chatGpt한테 물어봤는데 얘도 set이 낫대
아 자꾸 삼항연산자로 return 하는 걸 까머금
코드 깔끔하게 쓰는 연습 해야댕;;
'Algorithm Study' 카테고리의 다른 글
[Java Algorithm] 프로그래머스 Lv.0 _ 코드 처리하기 (0) | 2024.10.30 |
---|---|
[Java Algorithm] 프로그래머스: 해시 _ 완주하지 못한 선수 (0) | 2024.07.11 |
[Java Algorithm] 프로그래머스 Lv.0 _ 조건 문자열 (0) | 2024.03.11 |
[Java Algorithm] 프로그래머스 Lv.0 _ 홀짝에 따라 다른 값 반환하기 (1) | 2024.03.11 |
[Java Algorithm] 프로그래머스 Lv.0 _ 두 수의 연산값 비교하기 (2) | 2024.03.08 |