본문 바로가기
코딩테스트/프로그래머스

[프로그래머스/Java] LV.1 폰켓몬

by ⓞㅖ롱 2022. 8. 12.

먼저 배열 nums를 중복제거한 후 갯수를 세야겠다고 생각했다.

중복제거에는 여러가지 방법이 있지만 나는 HashSet으로 중복제거 하기로 했다.

뽑을 포켓몬 수 < 중복제거된 포켓몬 수 이면 뽑을 포켓몬수가 최댓값이 되고

뽑을 포켓몬 수 > 중복제거된 포켓몬 수 이면 중복제거 된 포켓몬을 모두 포함해야 하기 때문에  최댓값은 중복제거 된 포켓몬 수가 된다

 

내 코드

import java.util.Arrays;
import java.util.HashSet;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        int n = nums.length / 2;
        
        HashSet<Integer> hashSet = new HashSet<Integer>();
        for(int num : nums) hashSet.add(num);
        
        int hashSize = hashSet.size();
        if(hashSize > n){
            answer = n;
        } else {
            answer = hashSize;
        }
            
        return answer;
    }
}

 

다른사람 코드 1

이외에도 자바에서 배열의 중복값을 제거하는 방법이 더 있어서 정리해보았다.

import java.util.*;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        int size = (nums.length) / 2;
        
        ArrayList<Integer> kind_list = new ArrayList<>();
        for(int data : nums){
            if(!kind_list.contains(data)){
                kind_list.add(data);
            }
        }
        
        int cnt = kind_list.size();
        if(size < cnt){
            answer = size;
        }
        else{
            answer = cnt;
        }
        return answer;
    }
}

ArrayList를 사용한 방법으로 contains 함수를 사용해 배열 nums에 포함 되지 않은 숫자 일때 리스트에 숫자를 add한다.

 

다른사람 코드 2

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

class Solution {
    public int solution(int[] nums) {
    	/**
         * nums 배열을 받아 Arrays.stream(nums).boxed로 스트림을 생성한뒤,
         * Collectors.collectingAndThen로 Set으로 만들고,
         * phonekemons로 Set을 입력받아 phonkemons Set의 사이즈와 num.length/2의 최소값을 구해서,
         * Set의 int값 return
         **/
        return Arrays.stream(nums)
                .boxed()
                .collect(Collectors.collectingAndThen(Collectors.toSet(),
                        phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)));
    }
}

 

다른 사람 풀이보면 꼭 Arrays, stream.Collectors로 간단하게 해결하는 사람들 많더라..

사용할 줄 몰라서 항상 신기해만 함^^.. 날 잡고 공부해봐야지

 

이 코드에서 사용된 것만 간단히 보자면 boxed()는 Integer타입을 stream으로 변환 해주고

CollectingAndThen 메서드는 Collecting을 진행한 후 그 결과로 메서드를 하나 더 호출 할 수 있게 해준다고 한다.

여기서 toSet() 메소드를 통해 Set타입의 스트림을 생성하고 (Set타입은 중복되는 요소가 사라진다) 중복제거된 nums(=phonekemons) 의 크기와 원래의 nums.length/2 를 비교해 min() 함수로 더 작은 int값을 반환한다.