코딩테스트 - 프로그래머스/JAVA

[프로그래머스 / 연습문제 / 자바(JAVA)] 귤 고르기

읁; 2024. 4. 6. 17:08

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

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

programmers.co.kr

 

▼ ▼ ▼

정답 풀이로 바로 가기

▲ ▲ ▲

 

내 풀이 (오답)

 

로직

  1. 귤의 크기를 Key, 개수를 Value로 갖는 Map 객체를 생성한다.
  2. 이를 Value를 기준으로 내림차순 정렬한다.
  3. key의 값을 차례로 가져와 k에서 빼준다.
    • 이 때, k에서 value를 뺐을 때 k가 0 미만이 되는 경우에는 다음 key로 넘어간다.
  4. 종류의 수에 해당하는 return값 answer을 ++해준다.
  5. k가 0이 되면 반복문을 빠져나온다.

코드

import java.util.*;

class Solution {
    public int solution(int k, int[] tangerine) {
        int answer = 0;
        Map<Integer, Integer> size = new HashMap<>();

        for(int a : tangerine) {
            size.put(a, size.getOrDefault(a,0)+1);
        }

        List<Integer> list = new ArrayList<>(size.keySet());
        Collections.sort(list, (v1, v2) -> (size.get(v2).compareTo(size.get(v1))));

        for(int a : list) {

            if(k==0) {
                break;   
            }

            if(k-size.get(a)<0) {
                continue;
            } else if (k-size.get(a)>=0) {
                k -= size.get(a);
                answer++;
            }

        }

        return answer;
    }
}

채점 결과

정확성  테스트

테스트 1 〉    실패 (45.24ms, 80.2MB)
테스트 2 〉    실패 (30.93ms, 98MB)
테스트 3 〉    실패 (28.84ms, 82.2MB)
테스트 4 〉    실패 (26.67ms, 97.8MB)
테스트 5 〉    통과 (32.21ms, 79.9MB)
테스트 6 〉    통과 (27.66ms, 90.1MB)
테스트 7 〉    통과 (27.79ms, 93.4MB)
테스트 8 〉    실패 (36.91ms, 103MB)
테스트 9 〉    실패 (30.01ms, 83.2MB)
테스트 10 〉    통과 (30.03ms, 92.3MB)
테스트 11 〉    통과 (1.90ms, 76.1MB)
테스트 12 〉    통과 (0.72ms, 73.8MB)
테스트 13 〉    통과 (1.01ms, 74.1MB)
테스트 14 〉    통과 (0.87ms, 81.3MB)
테스트 15 〉    통과 (0.92ms, 74.1MB)
테스트 16 〉    실패 (0.81ms, 78.7MB)
테스트 17 〉    통과 (1.18ms, 76.8MB)
테스트 18 〉    통과 (0.94ms, 78.5MB)
테스트 19 〉    실패 (0.85ms, 75.3MB)
테스트 20 〉    통과 (0.73ms, 77MB)
테스트 21 〉    통과 (2.23ms, 74.7MB)
테스트 22 〉    통과 (3.05ms, 74.4MB)
테스트 23 〉    통과 (2.61ms, 80.4MB)
테스트 24 〉    통과 (2.49ms, 79.1MB)
테스트 25 〉    통과 (15.77ms, 84.6MB)
테스트 26 〉    통과 (21.97ms, 78.8MB)
테스트 27 〉    통과 (109.65ms, 104MB)
테스트 28 〉    통과 (71.20ms, 95.1MB)
테스트 29 〉    통과 (100.00ms, 112MB)
테스트 30 〉    통과 (91.10ms, 105MB)
테스트 31 〉    실패 (22.41ms, 95.6MB)
테스트 32 〉    통과 (28.82ms, 87.1MB)
테스트 33 〉    통과 (86.53ms, 105MB)
테스트 34 〉    통과 (70.70ms, 112MB)

채점 결과
정확성: 73.5
합계: 73.5 / 100.0

 

내 풀이 (정답)

로직

  1. key의 값을 차례로 가져와 k에서 빼준다.
    • 이 때, k에서 value를 뺐을 때 k가 0 미만이 되는 경우에는 다음 key로 넘어간다.

이 부분에서, k가 0 미만이 되는 경우에 다음 key로 넘어갈 필요가 없다!
그 크기의 귤 전체 개수에 딱 맞춰서 팔아야하는 것으로 문제를 잘못 해석했다.
해당 크기의 귤 개수 모두를 소모하지 못하더라도 괜찮음.
확장 for문 안의 해당부분 코드를 수정해주었다.

코드

//1차 PM 4:00 ~ 4:45
//2차 ~PM 4:55

import java.util.*;

class Solution {
    public int solution(int k, int[] tangerine) {
        int answer = 0;
        Map<Integer, Integer> size = new HashMap<>();

        for(int a : tangerine) {
            size.put(a, size.getOrDefault(a,0)+1);
        }

        List<Integer> list = new ArrayList<>(size.keySet());
        Collections.sort(list, (v1, v2) -> (size.get(v2).compareTo(size.get(v1))));

        for(int a : list) {

            if(k<=0) {
                break;   
            }

            k -= size.get(a);
            answer++;

        }

        return answer;
    }
}

채점 결과

정확성  테스트
테스트 1 〉    통과 (27.57ms, 96.9MB)
테스트 2 〉    통과 (22.92ms, 107MB)
테스트 3 〉    통과 (32.87ms, 97.7MB)
테스트 4 〉    통과 (24.74ms, 82.3MB)
테스트 5 〉    통과 (28.61ms, 84.6MB)
테스트 6 〉    통과 (18.70ms, 94MB)
테스트 7 〉    통과 (21.68ms, 95.1MB)
테스트 8 〉    통과 (22.97ms, 104MB)
테스트 9 〉    통과 (30.10ms, 79.6MB)
테스트 10 〉    통과 (27.84ms, 97.3MB)
테스트 11 〉    통과 (0.95ms, 76.6MB)
테스트 12 〉    통과 (0.93ms, 83MB)
테스트 13 〉    통과 (0.86ms, 75.5MB)
테스트 14 〉    통과 (0.72ms, 72.6MB)
테스트 15 〉    통과 (0.90ms, 73.3MB)
테스트 16 〉    통과 (0.66ms, 73.7MB)
테스트 17 〉    통과 (0.86ms, 76.6MB)
테스트 18 〉    통과 (0.71ms, 73.5MB)
테스트 19 〉    통과 (0.97ms, 79.5MB)
테스트 20 〉    통과 (0.88ms, 74.1MB)
테스트 21 〉    통과 (1.62ms, 80.9MB)
테스트 22 〉    통과 (3.44ms, 78.7MB)
테스트 23 〉    통과 (3.35ms, 79MB)
테스트 24 〉    통과 (2.13ms, 79.8MB)
테스트 25 〉    통과 (10.89ms, 83.3MB)
테스트 26 〉    통과 (22.21ms, 89.4MB)
테스트 27 〉    통과 (71.76ms, 107MB)
테스트 28 〉    통과 (44.13ms, 110MB)
테스트 29 〉    통과 (59.66ms, 106MB)
테스트 30 〉    통과 (56.84ms, 93.2MB)
테스트 31 〉    통과 (21.93ms, 86MB)
테스트 32 〉    통과 (35.40ms, 93.3MB)
테스트 33 〉    통과 (64.23ms, 109MB)
테스트 34 〉    통과 (82.08ms, 110MB)

채점 결과
정확성: 100.0
합계: 100.0 / 100.0

 

배운 점

  1. Map을 Value 기준으로 정렬하는 방법