본문 바로가기

알고리즘/프로그래머스

프로그래머스 - [PCCE 기출문제] 6번 / 물 부족 C++

SMALL

오늘은 이전 포스팅 2024.11.14 - [알고리즘/프로그래머스] - 프로그래머스 - [PCCE 기출문제] 5번 / 심폐소생 C++

에 이어 6번 문제를 풀어보았다. 이때까지 풀었던 PCCE 기출문제 시리즈 중 개인적인 생각으로는 수학적인 사고능력이 부족하다면 문제 풀이가 오래 걸렸을 거라 생각이 든다. 

 

알고리즘 난이도 및 시간 ( ※ 개인적인 의견 )

  • 난이도 : Level 1.5 ( ※ Min : 0, Max : 10 )
  • 풀이 시간 : 5분
  • 제출 횟수 : 1번 
  • 풀이 결과 : Pass

문제 설명

 문제는 지금 저수지에 남아 있는 물을 가지고 가뭄이 끝날 때까지 부족한지? 아니면 충분한지 계산하는 문제다. 딱히 문제에 함정이 존재하지는 않고, 매달 사용량 변화를 기반으로 총 필요한 물을 계산 후 저수지의 물과 비교 후 정답을 반환하면 되는 문제다.

출처 : 프로그래머스

제한 사항은 딱히 변수 Type에 영향을 줆만 한 범위도 없고, change는 처음부터 int 형으로 주어지기 때문에 -로 계산 후 +- 증감을 계산하면 된다.

출처 : 프로그래머스


문제풀이

 아래 문구를 하나 하나 해석하면서 풀이 방식이 논리적인지 검토하는 식으로 문제 풀이를 해보려고 한다.

  • int total_usage = 0 ; // 총사용량을 계산하기 위한 변수
  • for(int i = 0; i < change.size(); i++){  : 입력받은 달의 개수만큼 돌기 위한 구문 ※개인적으로 i++이 불편했다.
  • usage = total_usage * change [i] / 100; 이번달 사용량을 계산하기 위해 존재하는 구문으로 해석된다. 하지만 total_usage를 계속 사용한다면 usage는 이전달 대비가 아니라 총 사용량 대비가 되기 때문에 해당 구문을 수정해야 한다는 것을 알 수 있다.
  • total_usage += usage ; // 총사용량을 구하기 위해 이번달에 사용한 물의 양을 더하는 구문이다.
  • if(total_usage > storage) { 이때가지 사용한 물의 양이 저수지에 존재하는 물의 양 보다 많은지 확인하는 구문이다.
  • return i : 충분하지 않기 때문에 0이상을 반환하는 것으로 보인다. 해당 문제는 -1는 물이 충분하다는 의미고 그 이외의 숫자는 다 저수지 물의 양이 불충분하다는 것을 의미하기 때문이다.
  • return -1 : 해당 구문까지 왔다면 물의 양이 충분하다는 것을 의미한다.
#include <string>
#include <vector>

using namespace std;

int solution(int storage, int usage, vector<int> change) {
    int total_usage = 0;
    for(int i=0; i<change.size(); i++){
        usage = total_usage * change[i] / 100; 
        total_usage += usage;
        if(total_usage > storage){
            return i;
        }
    }
    return -1;
}

 

수정이 필요한 구문은 위의 내용에서 해석하면서 캐치하였다.

수정 전 구문

  • usage = total_usage * change[i] / 100;

수정 후 구문

  • usage += usage * change[i] / 100;  -> 해석을 하면 이전 달 대비 증감량이기 때문에 이와 같이 진행을 하였다. /100을 하는 이유는 10%라는 것은 0.1을 의미한다. 그래서 100으로 나누는 것이다.
#include <string>
#include <vector>

using namespace std;

int solution(int storage, int usage, vector<int> change) {
    int total_usage = 0;
    for(int i=0; i<change.size(); i++){
        usage += usage * change[i] / 100;
        total_usage += usage;
        if(total_usage > storage){
            return i;
        }
    }
    return -1;
}

결과

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

 

프로그래머스

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

programmers.co.kr