will come true

[프로그래머스 / Level1] 폰켓몬 (Java) 본문

Algorithm

[프로그래머스 / Level1] 폰켓몬 (Java)

haehyun 2021. 11. 5. 00:12
728x90

문제

https://programmers.co.kr/learn/courses/30/lessons/1845?language=java 

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.

programmers.co.kr

 

풀이

- 연구실에 있는 N마리의 폰켓몬 중 N/2마리를 선택
- 각 포켓몬은 종류별로 번호가 있으며, 최대한 다양한 종류로 포켓몬을 선택하고자 함
- 최대한 다양한 종류로 N/2마리 폰켓몬을 선택할 시, 종류 개수를 구하라.
- N은 항상 짝수

=> nums 배열의 요소들을 최대한 중복이 없게 N/2개 골랐을 때 '중복을 제거한 값의 개수'
★ "최대한 다양한 종류로" 라는 말이 붙으면 => "중복이 최대한 적게"로 해석 => Set 인터페이스 활용

 

기존 코드 (성공)

import java.util.*;

class Solution {
    public int solution(int[] nums) {        
        Set<Integer> set = new TreeSet<>();
        for(int num : nums){
            set.add(num);
        }
        
        return set.size() > nums.length / 2 ? nums.length / 2 : set.size();
    }
}
  • 순서를 유지하지 않고, 중복을 허용하지 않는 Set의 특성을 이용해, int배열 nums의 값에서 중복을 전부 제거.
  • 문제에서 구하고자 하는 것은 종류의 개수이기 때문에, set에 들어온 개수를 그대로 사용해도 괜찮으나, N(nums.length)의 절반만큼만 선택해야 하기 때문에 set의 사이즈가 N/2보다 클 경우에는 N/2값을 반환.
  • 예를들어 nums = { 1, 2, 2, 1, 2, 2 } 일 경우, N/2 = 3마리의 폰켓몬을 선택할 수 있지만, 어떤 경우의 수로 3마리를 선택해봤자 하나는 반드시 중복에 걸려 최대 2종류의 폰켓몬 밖에 선택하지 못 한다. 그렇기 때문에 처음부터 N/2 값은 고려조차 하지 않고 중복을 제거한 종류수 많을 구한 것. (종류 수 <= 선택한 폰켓몬 수)

 

개선 코드 (성공)

import java.util.*;

class Solution {
    public int solution(int[] nums) {        
        Set<Integer> set = new TreeSet<>();
        for(int num : nums){
            set.add(num);
        }
        
        return Math.min(set.size(), nums.length / 2);
    }
}
  • 기존에 삼항연산자로 set.size()가 nums.length 보다 클 경우 nums.length를 반환, 그렇지 않을 경우 set.size()를 반환하는 return문을 Math.min(int a, int b) 메서드를 사용해서 두 값 중 작은 쪽을 반환하는 것으로 변경.
    어떤 값을 return하고 싶은지(최소값) 한 눈에 들어오게 됐다.
728x90
Comments