1) 문제: 120830. 양꼬치
머쓱이네 양꼬치 가게는 10인분을 먹으면 음료수 하나를 서비스로 줍니다. 양꼬치는 1인분에 12,000원, 음료수는 2,000원입니다. 정수 n과 k가 매개변수로 주어졌을 때, 양꼬치 n인분과 음료수 k개를 먹었다면 총얼마를 지불해야 하는지 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 < n < 1,000
- n / 10 ≤ k < 1,000
- 서비스로 받은 음료수는 모두 마십니다.
2) 나의 첫 풀이
문제를 풀기 전 조건을 먼저 보고 생각했다.
10인분 이상 먹은 경우 음료수 1개는 서비스이기 때문에 값을 계산할 때 포함되면 안 된다.
해당 부분을 고려하여 코드를 작성해야겠다고 생각했다.
양꼬치를 10,20,30 단위로 먹어야 음료수가 공짜니까 10으로 나누었을 때 나머지가 없으면 된다.
해당 조건을 통해 문제를 풀어봐야겠다고 생각하고 문제를 풀었다.
if문을 통해 우선 제한 사항의 2가지 조건을 구현하고
해당 if문 안에서 if문과 else문으로 나누어 if문 안에는 나머지가 0인 경우, else문에는 나머지가 있는 경우를 계산하는 방법으로 풀이를 생각했다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int n, int k) {
int answer = 0;
if(0<n<1,000 && n/10<=k<1,000){
if(n%10==0)
return answer = 12,000*n;
else
return answer = 12,000*n + 2,000*k;
}
return answer;
}
생각한 대로 첫 번째 if문에서는 제한사항의 2가지 조건을 만족했다.
if문을 만족하면 10으로 나누었을 때 나머지가 없는 경우이므로 10인분, 20인분 단위로 먹은 경우일 때 음료의 값은 answer에 포함시키지 않았다.
반면 else문에서는 if문을 만족시키지 못해 벗어난 경우. 즉 나머지가 존재하는 경우이므로 해당 경우엔 음료값 2000원을 계산해 음료의 값을 받을 수 있도록 구현했다.
틀렸다ㅋㅋ 왜일까…?
문제를 찾았다. n이 7이라고 할 때 2번째 if문에서 나머지가 없다.
그러면 모든 코드가 무용지물이 된다. n이 10 이하인 경우를 if문 첫 번째 조건으로 만들고
기존의 조건들을 한 단계씩 뒤로 내리는 방법을 떠올렸다.
3) 수정한 풀이
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int n, int k) {
int answer = 0;
if(0<n<1000 && n/10<=k<1000){
if(n<10)
return answer = 12000*n;
else if(10<=n && n%10==0)
return answer = 12000*n;
else
return answer = 12000*n + 2000*k;
}
return answer;
}
입력값 | 10, 3 |
기댓값 | 124000 |
실행 결과 | 실행한 결괏값 120000이 기댓값 124000과 다릅니다. |
음.. 어딘가 잘못됐는데 어딜까?
찾았다.
10인분의 양꼬치와 3개의 음료수를 시킨 경우 음료수 2개의 값은 받아야 한다.
해당 조건은 첫 번째 else if문. 10으로 나누었을 때 나머지가 0인 경우에 추가해야 한다.
즉 (전체 먹은 음료수의 개수 - 서비스로 받은 음료수의 개수) * 2000원을 해야 하는 것이다.
else if(10<=n && n%10==0)
return answer = 12000*n + k-(서비스로 받은 음료수의 개수);
서비스로 받은 음료수의 개수… 이걸 어떻게 구할까…
몫 연산자를 사용해서 구하면 될 듯하다.
30인분 먹고 5개 음료수를 먹은 경우 3개를 서비스받은 거니까… 3이란 값이 나와야 한다.
else if(10<=n && n%10==0)
return answer = 12000*n + k-(n/10);
다음과 같이 몫을 구하는 식을 만들었고,
이제는 두 번째 else if문에서 음료수의 값을 계산하는 부분을 수정해야 한다.
else
return answer = 12000*n + 2000*(k-(n/10));
수정했는데도 불구하고 테스트 케이스 2 경우 중 1 경우만 정답처리가 되었다.
테스트 1
입력값: 10, 3
기댓값: 124000
실행한 결괏값: 120002이 기댓값 124000과 다릅니다.
테스트 2
입력값: 64, 6
기댓값: 768000
실행한 결괏값: 테스트를 통과하였습니다
→ 테스트 1의 경우 10인분을 먹었기에 음료수 값은 1개를 제외한 2개만 받아야 한다.
찾았다… 2000원을 곱하지 않았다..ㅋㅋ
4) 마지막으로 수정한 풀이
#include <stdbool.h>
#include <stdlib.h>
int solution(int n, int k) {
int answer = 0;
if(0<n<1000 && n/10<=k<1000){
if(n<10)
return answer = 12000*n + 2000*k;
else if(10<=n && n%10==0)
return answer = 12000*n + 2000*(k-(n/10));
else
return answer = 12000*n + 2000*(k-(n/10));
}
return answer;
}
5) 배운 점
하나하나 구현하고 실행하고 오류 찾고 고치는 과정을 겪으며 처음으로 문제를 풀었다.
한 문제 푸는데 거의 30분이 걸리긴 했는데 직접 하나하나 고치면서 문제를 이해하려고 노력한 것 같아 기분이 좋다.
'Computer Science > PS' 카테고리의 다른 글
[PS] 120814. 피자 나눠 먹기(1) (0) | 2023.11.05 |
---|---|
[PS] 120898. 편지 (0) | 2023.11.05 |
[PS] 120817. 배열의 평균값 (1) | 2023.11.03 |
[PS] 120829. 각도기 (0) | 2023.11.03 |
[PS] 120831. 짝수의 합 (0) | 2023.11.01 |