개발하는 고양이 오이

12. [JAVA] 프로그래머스 코딩테스트 연습 Level.1 - 예산 / 2,6,18,19번 실패 해결 / 다른 사람의 풀이 본문

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

12. [JAVA] 프로그래머스 코딩테스트 연습 Level.1 - 예산 / 2,6,18,19번 실패 해결 / 다른 사람의 풀이

Cucum 2022. 4. 28. 10:46

 

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

프로그래머스 코딩테스트 연습 Level.1 - 예산



풀이

import java.util.*;

class Solution {
    public int solution(int[] d, int budget) {
        int answer = 0;
        
        // 오름차순 정렬
        Arrays.sort(d);
    
        int sum = 0;
        for (int i = 0; i < d.length; i++) {

            // * d.length == 0 은 확인하지 않아도 됨. why? 제한사항에서 전체 부서의 개수는 1이상이라고 표시
            
            if (budget < d[i]) {        // 예산이 부족하다면
                answer = 0;
                break;
            }
            else if (d.length == 1 && d[i] < budget) {  // 신청 부서가 하나이면서 신청 금액이 예산보다 작다면
                answer = 1;
                break;
            } 
            else {          // 신청 부서가 한개 이상
                sum += d[i];
                
                if (sum > budget) {     // 신청 금액의 함이 예산보다 커지면
                    return answer;
                }
                answer++;
            }
        }
        return answer;
    }
}

 


(풀이 실패 과정)

import java.util.*;

class Solution {
    public int solution(int[] d, int budget) {
        int answer = 0;
        
        Arrays.sort(d);
        
        int sum = 0;
        for (int i = 0; i < d.length; i++) {
            sum += d[i];
   
            if (sum > budget) {
                answer = i;
                break;
            } else if (sum == budget) {
                answer = i + 1;
                break;
            }
        }
        
        return answer;
    }
}

 첫번째 시도에서 테스트케이스 2,6,18,19번 실패

 

이유를 몰라서 검색을 진행해보니 부서가 하나인 경우를 확인해주지 않아서 문제

 

실제로 테스트케이스에 부서가 한개인 경우를 추가해보니 실패

 

import java.util.*;

class Solution {
    public int solution(int[] d, int budget) {
        int answer = 0;
        
        Arrays.sort(d);
        
        int sum = 0;
        for (int i = 0; i < d.length; i++) {
            sum += d[i];
   
            // 부서가 하나이면서 신청 금액이 예산보다 작다면
            if (d.length == 1 && sum < budget) {
                answer = 1;
                break;
            }
            else if (sum > budget) {
                answer = i;
                break;
            } else if (sum == budget) {
                answer = i + 1;
                break;
            }
        }
        
        return answer;
    }
}

두번째 시도에서 테스트케이스 6,18,19번 실패

 

이에 대한 이유는 확실하게 알지 못했지만,

하단의 if-else문에서 answer값을 i로 찾는게 아니라, 오름차순으로 정렬해서 합해나간 금액(sum)이 예산(budget)보다 커지는 순간 return answer를 해줬고, 아닐때는 answer++로 바꿔서 풀었더니 통과

 


다른 사람의 풀이

정렬 후 처음 신청 금액부터 합해나가는 방법이 아닌, 총 예산에서 빼나가는 방법으로 짧게 표현 가능

감사합니다.