알고리즘/프로그래머스

[프로그래머스] 폰켓몬 for JAVA

정석이 2021. 12. 13. 19:47

https://programmers.co.kr/learn/courses/30/lessons/1845

 

코딩테스트 연습 - 폰켓몬

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

programmers.co.kr

 

 

문제

 

 


 

내가 푼 방법

 

 

nums 배열 속 숫자의 중복을 제거하여 폰켓몬이 몇 종류가 있는지 파악한다.

 

 

가질 수 있는 폰켓몬 수 = nums.length / 2

 

 

폰켓몬 종류 > 가질 수 있는 수  -> return 가질 수 있는 폰켓몬 수

 

폰켓몬 종류 <= 가질 수 있는 수  -> return 폰켓몬의 종류

 

 

 

 

코드

 

import java.util.ArrayList;
class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        
        int have = nums.length / 2;
        ArrayList<Integer> arrayList = new ArrayList<>();
        
        for(int phonekemon : nums){
            if(!arrayList.contains(phonekemon))
                arrayList.add(phonekemon);
        } // 중복 제거해서 arrayList에 넣기
        
        if(arrayList.size() > have) answer = have;
        else answer = arrayList.size();
        
        return answer;
        
        
    }
}

 

ArrayList를 사용하여 중복을 제거했다.

 

 

 

성능

 

 

 

 


 

배열의 중복을 제거하는 법

 

 

 

위에서 사용한 방법처럼 ArrayList나 List를 사용할 수 있다.

 

참고 ArrayList와 list의 차이 : https://com-on-bappool.tistory.com/50

 

 

 

1. ArrayList 사용

 

- arrayList에 넣을 때 중복을 제거해서 넣기

 

 

       for(int phonekemon : nums){
            if(!arrayList.contains(phonekemon))
                arrayList.add(phonekemon);
        } // 중복 제거해서 arrayList에 넣기

 

 

 

2. Set 사용

 

1) HashSet 사용

 

 

        import java.util.HashSet;

 

        HashSet<int> hashSet = new HashSet<>();

 

        for(int phonekemon : nums)

              hashSet.add(phonekemon);

 

 

 

2) TreeSet 사용 : 오름차순 정렬됨

 

 

        import java.util.TreeSet;

 

        TreeSet<int> treeSet = new TreeSet<>();

 

        for(int phonekemon : nums)

              treeSet.add(phonekemon);

 

 

 

3) LinkedHashSet 사용 : 입력된 순서대로 정렬됨

 

 

        import java.util.LinkedHashSet;

 

        LinkedHashSet<int> linkedHashSet = new LinkedHashSet<>();

 

        for(int phonekemon : nums)

              linkedHashSet.add(phonekemon);

 

 

 

3. Stream 사용 (Java 8~)

 

 

// 배열 -> strem -> 중복제거 -> 배열(예시는 String)

String[] resultArray = Arrays.stream(array).distinct().toArray(String[]::new);

 

 

 


 

 

다른 사람의 코드

 

 

 

 

 

stream은 요소를 수집하는 collect()를 제공해 필요한 것만 담을 수 있다.

 

 

boxed() -> primitive 타입을 wrapper 타입으로 박싱하여 반환

 

CollectingAndThen 메서드로 Collecting을 진행한 후 그 결과로 메서드를 하나 더 호출

Collectors.toSet() -> stream요소를 set 인스턴스로 수집

 

폰켓몬 종류(phonekemons.size())와 가질 수 있는 개수(nums.length/2) 중에 작은걸 담는다.

 

 

 

 

 

 

 

내가 푼거랑 비슷한데 return 할 때를 간편하게 했음

 

종류랑 가질 수 있는것 중에 작은걸 출력!! 한다는 코드를 사용하는게 더 간편하다!

 

 

return (nums.length / 2 > list.size()) ? list.size() : nums.length / 2;

 

 

요렇게~~!