ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스/JAVA] 귤 고르기
    Algorithm/Java 2024. 11. 24. 17:08

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

     

    프로그래머스

    SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr


    [ 오답 노트 ]
    ❌ 기존 오답 코드

    import java.util.*;
    
    class Solution {
        public int solution(int k, int[] tangerine) {
                //  1 : 1개, 2 : 2개, 3 : 2개, 4 : 1개, 5 : 2개
                // k = 6일때 종류의 값을 합한 수가 6이 되어야함 (종류의 개수가 큰 수 부터 하나씩 값 더하기)
                // (2 : 2개) + (3 : 2개) + (5 : 2개) = 6
                // 남은 키의 개수인 3이 정답!
                
                // 1 : 1개, 2 : 2개, 3 : 2개, 4 : 1개, 5 : 2개
                // k = 4
                // (2 : 2개) + (3 : 2개) = 4
                // 남은 키의 개수인 2가 정답!
                
                // 1 : 4개, 2 : 3개, 3 : 1개
                // k = 2
                // (1 : 1개) + (2 : 1개) = 2
                // 남은 키의 개수인 1이 정답!
            HashMap<Integer, Ingetger> hm = new HashMap<>();
            for(int i = 0; i < tangerine.length; i++) {
                // 처음 나오는 수이면 키에 추가, 기존에 있던 수이면 기존 키에 +1
                // (이부분 함수 수정 필요....! ㅜ 문법 모름..)
                hm.put(tangerine[i], hm.contains(tangerine[i]));
            }
            
            // 값의 개수가 제일 많은 순으로 더하기
            // (2 : 2개) + (3 : 2개) + (5 : 2개) = 6
            ArrayList<Integer> list = new ArrayList<>();
            for(int i = 0; i < hm.length; i++) {
                // (이부분 함수 수정 필요....! ㅜ 문법 모름..)
                list.add(hm.getKey(i), hm.getValue(i));
            }
            
            int sum = 0;
            for(int j = 0; j < list.size(); j++) {
                // 값의 개수가 큰 수 부터 정렬 후 각 값의 개수 하나씩 더하기 
                // (2 : 2개) + (3 : 2개) + (5 : 2개) = 6
                Arrays.sort(hm.get(list.get(i)));
                sum += hm.get(list.get(i));
                // 키 종류의 개수 더하기(2, 3, 5 -> 총 3개가 정답!)
                if(sum == k) {
                    answer = 
                }
            }
            
            return answer;
        }
    }

     

    📌 기존 코드의 문제점

     

    1. HashMap에 값 추가 및 갱신 방식 오류

    처음 나오는 수이면 키에 추가, 기존에 있던 수이면 기존 키에 +1 하는 방식이 문법 수정이 필요하다. 

     

    2. HashMap 관련 문법 오류 

    해시맵에는 getKey(i)나 getValue(i) 같은 인덱스 접근 방식이 없으므로 컴파일 에러 발생한다. 해시맵의 크기 또한 hm.length() 가 아님 hm.size()로 가져와야 맞다. 

     

    3. 필요한 크기 종류 계산 로직 오류

    Arrays.sort()는 배열 정렬 방식에 알맞고, 해시맵의 값 정렬에는 부적합하다. hm.get(list.get(i)) 부분 또한 문법 오류가 있다. 


     

    [ 정답 코드 & 올바른 풀이 ]

     

    📌 최종 수정 후 코드와 기존 코드 비교 요약

     

    항목 기존 코드 문제점 수정 후 개선점
    HashMap 값 추가 및 갱신 contains로 boolean 값을 넣어 값 추가 및 갱신 불가. getOrDefault로 초기값 처리 후 값 증가.
    HashMap 값 정렬 잘못된 getKey(i) 및 getValue(i) 방식 사용. HashMap.values()로 값 추출 후 리스트에 저장, Collections.sort()로 정렬.
    종류 수 계산 로직 Arrays.sort()와 잘못된 데이터 접근 방식. 리스트의 값을 순차적으로 더하면서 조건 만족 시 종료.

     


     

    📌 정답 코드

    import java.util.*;
    
    class Solution {
        public int solution(int k, int[] tangerine) {
             //  1 : 1개, 2 : 2개, 3 : 2개, 4 : 1개, 5 : 2개
                // k = 6일때 종류의 값을 합한 수가 6이 되어야함 (종류의 개수가 큰 수 부터 하나씩 값 더하기)
                // (2 : 2개) + (3 : 2개) + (5 : 2개) = 6
                // 남은 키의 개수인 3이 정답!
                
                // 1 : 1개, 2 : 2개, 3 : 2개, 4 : 1개, 5 : 2개
                // k = 4
                // (2 : 2개) + (3 : 2개) = 4
                // 남은 키의 개수인 2가 정답!
                
                // 1 : 4개, 2 : 3개, 3 : 1개
                // k = 2
                // (1 : 1개) + (2 : 1개) = 2
                // 남은 키의 개수인 1이 정답!
            
            HashMap<Integer, Integer> hm = new HashMap<>();
            for(int i = 0; i < tangerine.length; i++) {
                // 처음 나오는 크기면 1로 초기화, 기존에 있던 크기면 값 증가
                hm.put(tangerine[i], hm.getOrDefault(tangerine[i], 0) + 1);
            }
            
            // 값의 개수를 기준으로 정렬하기 위해 리스트에 추가
             ArrayList<Integer> list = new ArrayList<>(hm.values());
            // list = [1, 2, 2, 2, 1]
            
            // 내림차순 정렬 (개수가 많은 것부터 정렬)
            // (**배열은 Arrays.sort()로 정렬하고 ArrayList는 Collections.sort로 정렬하기**)
            Collections.sort(list, Collections.reverseOrder());
            // list = [2, 2, 2, 1, 1]
            
            // 각 값의 개수 하나씩 더해서 k보다 크거나 같으면 결과 도출 
            int sum = 0;
            int answer = 0;
            for(int j = 0; j < list.size(); j++) {
                sum += list.get(j);
                answer++; // 종류 수 증가 
                 if(sum >= k) {
                    break;
                }
            }
            
            return answer;
        }
    }
    반응형
Designed by Tistory.