본문 바로가기

Problem Solving/[Java] Programmers

[Java] 프로그래머스: 폰켓몬

문제 이해

  • 연구실에 있는 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()가 있다는 걸 배울 수 있었다.

 

언젠가 중복을 제거할 일이 있다면 꼭 상기하도록 하자.