본문 바로가기
algorithm/Programmers

[JAVA] 폰켓몬

by 이쟝 2023. 3. 28.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

HashSet, TreesSet

HashMap, Hashtable


1. 가장 많은 종류의 폰켓몬을 선택하는 방법 찾기

2. return 값이 nums.length( )보다 크면 nums.length/2 아니면 구한 값

 

1. stack을 활용한 풀이

import java.util.Stack;

class Solution {
    public int solution(int[] nums) {
        Stack<Integer> stack = new Stack<>();

        for(int i=0;i<nums.length;i++) {
            if(!stack.contains(nums[i])) stack.push(nums[i]);
        }
        
        return stack.size() > nums.length/2 ? nums.length/2 : stack.size();
    }
}

 

  • 처음에 hash를 stack으로 잘못 생각하고 stack을 활용해서 풀었다.
  • stack.contains( ) 특정 값이 존재하면 true 아니면 false
  • 시간은 for문 때문인지 조금 오래 걸렸다.

2. ArrayList와 Hashset을 이용한 풀이

import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;


class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        ArrayList<Integer> list = new ArrayList<>();
        for(int i : nums) list.add(i);
        Set<Integer> set = new HashSet<>(list);
        
        return answer = (set.size() > nums.length/2) ? nums.length/2 : set.size();
    }
}

 

  • Set을 활용하면 자동으로 중복되기 때문에 HashSet을 사용하였다.
  • 1번보다 시간은 훨씬 빨라졌다.
  • set은 추상 클래스이기 때문에 set 그자체로 쓸 수는 없어서 HashSet으로 사용했다.
  • HashSet : Set을 구현하는 대표 클래스, 데이터 중복할 수 없고, 순서를 보장하지 않는다.
  • TreeSet : HashSet 특성 + 오름차순으로 데이터를 정렬한다.
  • LinkedHashSet :HashSet 특성 + 입력한 순서대로 데이터를 저장한다.

3. HashSet만 이용한 풀이

import java.util.HashSet;

class Solution {

   public int solution(int[] nums) {
        HashSet<Integer> hashset = new HashSet<>();
        for(int i : nums) {
            hashset.add(i);
        }
       
        return (nums.length/ 2 > hashset.size()) ? hashset.size() : nums.length/2;
    }
}

 

  • HashSet만으로도 풀이를 바로 할 수 있다..!
  • 제일 시간이 빠르다! 

 

+ 완주하지 못한 선수를 풀고 나서 HashMap으로 푼 풀이

import java.util.HashMap;

class Solution {
   public int solution(int[] nums) {
        
        HashMap<Integer, Integer> hmap = new HashMap<>();
       
        for(int i : nums)  hmap.put(i, hmap.getOrDefault(i, 0)+1);
       
        return (hmap.size() > nums.length/2 ? nums.length/2 : hmap.size());
    }
}

 

  • getOrDefault로 굳이 할 필요 없다 왜냐면 size가 궁금한 거라서.. 그래서 hashSet으로 풀어도 상관없는 거였음!

'algorithm > Programmers' 카테고리의 다른 글

[JAVA] 전화번호 목록  (0) 2023.03.29
[JAVA] 완주하지 못한 선수  (0) 2023.03.28
[JAVA]숨어있는 숫자의 덧셈 (2)  (0) 2023.03.25
[JAVA] 이진수 더하기  (0) 2023.03.23
[JAVA] 잘라서 배열로 저장하기  (0) 2023.03.23