티스토리 뷰

알고리즘, 코딩테스트

[프로그래머스] 폰켄몬

몰라모르겠어요 2022. 8. 18. 22:57

N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.

 

처음에 그냥 풀었을 때

public int solution_1_1(int[] nums){
    int answer = 0;
    int half = (int)nums.length/2;

    Arrays.sort(nums);

    int type = 0;
    int prenum = 0;
    for(int i=0; i < nums.length; i++){
        if(prenum != nums[i]){
            type++;
        }
        prenum = nums[i];
    }

    if(half < type) {
        answer = half;
    }else{
        answer = type;
    }
    return answer;
}

1. 먼저 N/2 값을 구한다.

2. 폰켄몬 종류를 구하기 위해 정렬한다.(2313 -> 1233)

3. for 문을 돌려 현재 종류가 이전 값과 다르면 종류 값 ++, 같으면 그냥 넘어간다.

4. N/2 와 종류의 크기 중 더 작은 것을 반환한다.(N이 아무리 커도 종류가 적으면 그 종류만큼만 선택할 수 있으니까)

 

해시맵을 이용해서 푸는 방법

해시맵은 value 값 중복을 허용하지 않는다.

public int solution_1_2(int[] nums){
    int answer = 0;
    HashMap<Integer, Integer> map = new HashMap();

    int half = (int)nums.length/2;

    for(int i=0; i < nums.length; i++){
        map.put(nums[i], nums[i]);
    }
    int type = map.size();

    if(type < half){
        answer = type;
    }else{
        answer = half;
    }

1. 먼저 N/2 값을 구한다.

2. for문을 돌려 그냥 종류 배열을 맵에 넣는다.(중복을 허용하지 않아 같은 종류면 자동으로 덮어쓰기 됨)

3. 똑같이 N/2와 종류 값을 비교해 더 적은 것을 반환한다.

 

해시셋을 이용하는 방법(다른 사람의 풀이)

public int solution_1_3(int[] nums){
    //중복을 제거해주는 해시셋을 생성한다.
    HashSet<Integer> hs = new HashSet<>();
    //자동으로 중복이 제거되므로 종류가 나온다.
    for(int i=0; i < nums.length; i++){
        hs.add(nums[i]);
    }
    //종류와 N/2 중 작은 것을 돌려준다.
    if(hs.size() > nums.length/2){
        return nums.length/2;
    }

    return hs.size();
}

맵과 동일하게 보면 될 것 같다. 이게 더 편하다.

굳이 해시맵에서 <Integer, Integer> 설정할 필요없이 셋으로 객체는 어차피 다르고 value 비교는 알아서 해주니 value 중복 없이 종류를 구할 수 있다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함