[알고리즘 문제풀이] HashMap

jr_necki·2022년 8월 8일
0

(4-1) 학급회장

🚩 내 코드

  Scanner scanner = new Scanner(System.in);
        int N = Integer.parseInt(scanner.nextLine());
        String [] arr = scanner.nextLine().split("");

        HashMap<String, Integer> hm = new HashMap<>();
        for(String s : arr){
            hm.put(s,hm.getOrDefault(s,0)+1);
        }
        // ✔ 방법1.
        String answer="";
        int max = Integer.MIN_VALUE;
        for(String key : hm.keySet()){
            if(hm.get(key) > max){
                max = hm.get(key);
                answer=key;
            }
        }
        System.out.println(answer);

        // ✔ 방법2.
        // Collections.sort()를 사용하기 위해 List 형태로 Map을 가져와야함.
        List<Map.Entry<String,Integer>> entryList = new LinkedList<>(hm.entrySet());
        // 정렬 내장 함수 사용
        entryList.sort(Map.Entry.comparingByValue());
        for(Map.Entry<String, Integer> entry : entryList){
            //System.out.println("key: "+entry.getKey()+" value: "+entry.getValue());
        }

💡 푼 방식

HashMap 사용하여 알파벳과 개수를 짝지었다.
갯수는 map.getOrDefault함수를 사용하여, 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환한다. 따라서 내 코드에서는 찾는키가 없다면 0을 있다면 value를 반환하고 거기에 +1을 해줌으로써 개수를 세주는거다.

📚 알게 된 정보

굳이 정렬함수를 쓰지 않아도, max라는 변수를 이용하여 제일 큰 값을 찾아낼 수 있다.
정렬함수를 쓰기 위해서는 hashmap을 list형태로 변환해주어야한다.
참고


(4-2) 아나그램

🚩 내 코드

  		Scanner scanner = new Scanner(System.in);
        HashMap<String,Integer> map1 = new HashMap<>();
        HashMap<String,Integer> map2 = new HashMap<>();
        String[] arr1 = scanner.nextLine().split("");
        String[] arr2 = scanner.nextLine().split("");

        for(String s : arr1){
            map1.put(s,map1.getOrDefault(s,0)+1);
        }

        String answer = "YES";
        // arr1과 비교하기
        for(String s : arr2){
            if(!map1.containsKey(s) || map1.get(s) == 0) { // 키가 없거나, value값이 다르다면
                answer="NO";
                break;
            }else{
                map1.put(s, map1.get(s)-1); // 키가 같은거에서는 1빼줌 (개수 세야되니까)
            }
        }
        System.out.println(answer);

💡 푼 방식

HashMap 사용하여 알파벳과 개수를 짝지었다.
갯수는 map.getOrDefault함수를 사용하여, 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환한다. 따라서 내 코드에서는 찾는키가 없다면 0을 있다면 value를 반환하고 거기에 +1을 해줌으로써 개수를 세주는거다.
그리고 다음 배열에서 있는 건 -1로 해서 개수를 맞춰본다.

📚 알게 된 정보

(4-3) 매출액의 종류

🚩 내 코드

  		 Scanner scanner = new Scanner(System.in);
        int N = Integer.parseInt(scanner.next());
        int K = Integer.parseInt(scanner.next());

        int [] arr = new int[N];
        for(int i=0; i<arr.length; i++){
            arr[i] = Integer.parseInt(scanner.next());
        }
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int i=0; i<K; i++){
            map.put(arr[i],map.getOrDefault(arr[i],0)+1);
        }

        int size = map.size();
        System.out.print(size+" ");

        for(int i=0; i<N-K; i++){
            map.put(arr[i],map.getOrDefault(arr[i],0)-1);
            map.put(arr[i+K],map.getOrDefault(arr[i+K],0)+1);
            if(map.get(arr[i])==0){
                map.remove(arr[i]);
            }
            System.out.print(map.size()+" ");
        }

💡 푼 방식

HashMap 사용하여 매출액과 개수를 짝지었다.
갯수는 map.getOrDefault함수를 사용하였고, two Pointers 방식으로 따져보았다.

📚 알게 된 정보

hashmap + two pointers

(4-5) K번째 큰 수

🚩 내 코드

   		Scanner scanner = new Scanner(System.in);
        int N = Integer.parseInt(scanner.next());
        int K = Integer.parseInt(scanner .next());
        int [] nums = new int[N];
        for(int i=0; i<N; i++){
            nums[i] = Integer.parseInt(scanner.next());
        }

        // 중복 피함
        TreeSet<Integer> tset = new TreeSet<>(Collections.reverseOrder());

        //3장을 뽑는 것이므로 3중 for문
        for(int i=0; i<N; i++){
            for (int j=i+1; j<N; j++){
                for(int l=j+1; l<N; l++){
                    tset.add(nums[i]+nums[j]+nums[l]);
                }
            }
        }
        int cnt=0;
        for(int x : tset){
            cnt++;
            if(cnt == K){
                System.out.println(x);
            }

💡 푼 방식

3중for문을 이용하여 숫자3개를 뽑았고 그 합을 TreeSet에 넣었다.

📚 알게 된 정보

3개를 어떻게 뽑지라고 고민했는데 그냥 3중for문을 쓰면 되는거였다.
합이 같은것이 여러개 나올 수 있는데, 중복을 제거하는 TreeSet에 넣으면 해결되었다.

treeset
Set 인터페이스를 구현한 클래스로써 객체를 중복해서 저장할 수 없고 저장 순서가 유지되지 않는다는 Set의 성질

TreeSet<Integer> set1 = new TreeSet<Integer>();//TreeSet생성
TreeSet<Integer> set2 = new TreeSet<>();//new에서 타입 파라미터 생략가능
TreeSet<Integer> set3 = new TreeSet<Integer>(set1);//set1의 모든 값을 가진 TreeSet생성
TreeSet<Integer> set4 = new TreeSet<Integer>(Arrays.asList(1,2,3));//초기값 지정

TreeSet<Integer> tset = new TreeSet<>(Collections.reverseOrder());

TreeSet 참고1
TreeSet 참고2

profile
슉슉슉

0개의 댓글