문제 이해
- 연구실에 있는 N마리의 폰켓몬 중에서 N/2마리를 가져갈 수 있습니다.
- 폰켓몬은 종류에 따라 번호를 붙여 구분합니다.
- 당신은 최대한 다양한 종류의 폰켓몬을 가지길 원합니다.
<조건>
- 알 수 없음
<입력>
- nums: 폰켓몬의 종류 번호 (1 ~ 10,000, 10^4)
- ※ 항상 짝수로 주어짐
- ※ 종류 번호: 1 ~ 200,000
<출력>
- N/2마리의 폰켓몬을 선택하는 방법 중 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아,
- 그때의 폰켓몬 종류 번호의 개수를 return하시오.
- ※ 선택하는 방법이 여러 가지여도 한 가지 케이스만 return하라.
문제 풀이
우리가 신경써야 할 건 폰켓몬의 종류밖에 없다.
중복되어서 입력된 값들을 제거만 할 수 있다면 무엇이든 상관없는 문제였다.
나는 Collections의 Set을 사용하는 방법과 Stream의 distinct()를 사용한 두 가지 풀이로 이 문제에 접근했다!
1. Set
먼저 입력을 다 Set 컬랙션에 넣으면, 자동으로 중복이 제거된다.
Set<Integer> set = new HashSet<>();
for(int i = 0; i < nums.length; i++){
set.add(nums[i]);
}
이후 N/2와 Set의 사이즈를 비교해서 answer에 대입해주었다.
2. Stream.distinct()
받은 입력값을 stream으로 전환한 뒤, distinct()를 통해 중복을 제거해 그 개수를 count했다.
int typeNum = (int)Arrays.stream(nums).distinct().count();
이후는 위와 동일하다.
전체 코드
Set
import java.util.*;
class Solution {
public int solution(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int i = 0; i < nums.length; i++){
set.add(nums[i]);
}
int answer;
if(nums.length/2 <= set.size()){
answer = nums.length/2;
}else{
answer = set.size();
}
return answer;
}
}
Stream.distinct()
import java.util.*;
class Solution {
public int solution(int[] nums) {
int typeNum = (int)Arrays.stream(nums).distinct().count();
int answer = (typeNum < nums.length/2) ? typeNum : nums.length/2;
return answer;
}
}
배운 점
자바에서 중복을 제거하는 방법으로
Set 컬랙션의 사용과 Stream.distinct()가 있다는 걸 배울 수 있었다.
언젠가 중복을 제거할 일이 있다면 꼭 상기하도록 하자.
'Problem Solving > [Java] Programmers' 카테고리의 다른 글
[Java] 프로그래머스: 디스크 컨트롤러 (0) | 2025.01.18 |
---|---|
[Java] 프로그래머스: 가장 큰 수 (0) | 2025.01.18 |
[Java] 프로그래머스: K번째수 (0) | 2025.01.18 |
[Java] 프로그래머스: 전화번호 목록 (0) | 2025.01.12 |
[Java] 프로그래머스: 완주하지 못한 선수 (0) | 2025.01.12 |