폰켓몬_Java

컴투루·2022년 6월 30일
0

프로그래머스 Lv.1

목록 보기
31/38

찾아라 프로그래밍 마에스터

🔥 폰켓몬 🔥


👀 문제

당신은 폰켓몬을 잡기 위한 여행 중✈️
드디어 홍박사의 연구실에 도착❗️

박사님은 연구실에 있는 총 n마리의 폰켓몬 중에서 n/2마리를 가져가도 좋다고 한다. 폰켓몬은 종류에 따라서 번호룰 붙여 구분한다.

당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 한다.

N마리의 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아 그때의 폰켓몬 종류 번호의 개수를 return하는 solution을 완성해보자


✔️ 조건

  • nums는 폰켓몬의 종류 번호가 담긴 1차원 배열입니다.
  • nums의 길이(N)는 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다.
  • 폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다.
  • 가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도, 선택할 수 있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다.

👩‍💻 입력 & 🧙 출력

numsresult
[3,1,2,3]2
[3,3,3,2,2,4]3
[3,3,3,2,2,2]2

🙋‍♀️ 풀이

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        List<Integer>list = Arrays.stream(nums)
                                    .boxed()
                                    .collect(Collectors.toList());
        
        list =  list.stream().distinct().collect(Collectors.toList());
        
        if(nums.length/2 >list.size()){ 
            answer = list.size();
        }else{
            answer= nums.length/2;
        }
       
        return answer;
    }
}
  1. nums를 stream을 이용해서 list로 변환시키고 중복을 제거해주었다.
  2. 가져갈 수 있는 폰켓몬이 폰켓몬의 종류보다 크다면 폰켓몬의 종류가 최대인 것이고 그렇지 않다면 가져갈 수 있는 폰켓문의 수가 최대인것이다.

💬 다른 풀이

import java.util.Arrays;
import java.util.stream.Collectors;

class Solution {
    public int solution(int[] nums) {
        return Arrays.stream(nums)
                .boxed()
                .collect(Collectors.collectingAndThen(Collectors.toSet(),
                        phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)));
    }
}

더 간결해보이는 이유는 중복을 제거하는 코드를 따로 넣지 않고 Collectors에서 toList가 아니라 toSet을 통해서 중복을 제거했기 때문이다.
그리고 Integer.min을 이용해서 폰켓몬의 사이즈와 가져갈 수있는 폰켓몬 중 최소값을 리턴하도록 했다.

profile
맘 먹으면 못할 게 없지

0개의 댓글