Algorithm/Java

[프로그래머스/JAVA] 귤 고르기

dbfl9911 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;
    }
}
반응형