백준 14916 거스름돈
문제
춘향이는 편의점 카운터에서 일한다.
손님이 2원짜리와 5원짜리로만 거스름돈을 달라고 한다. 2원짜리 동전과 5원짜리 동전은 무한정 많이 가지고 있다. 동전의 개수가 최소가 되도록 거슬러 주어야 한다. 거스름돈이 n인 경우, 최소 동전의 개수가 몇 개인지 알려주는 프로그램을 작성하시오.
예를 들어, 거스름돈이 15원이면 5원짜리 3개를, 거스름돈이 14원이면 5원짜리 2개와 2원짜리 2개로 총 4개를, 거스름돈이 13원이면 5원짜리 1개와 2원짜리 4개로 총 5개를 주어야 동전의 개수가 최소가 된다.
입력
첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다.
출력
거스름돈 동전의 최소 개수를 출력한다. 만약 거슬러 줄 수 없으면 -1을 출력한다.
www.acmicpc.net
풀이
1. 제일 먼저 들었던 생각은, 5원을 먼저 쓰고 그다음에 2원을 써야겠다는 접근법이었다.
2. 당장은 c언어밖에 할 수 없기 때문에, c언어로 먼저 하고 C++로 변환해야겠다는 생각이 들었다.
3. 입력 받은 값을 5의 나머지와 계산을 하고, 그 나머지로 다시 2를 나머지를 이용한다.(찾아봄)
4. 거스름돈이 5와 2로 안나눠 떨어질때(1 ,3과 같이)는 예외적인 상황. 그런데 5 이상으론 모두 2와 5로 표현이 가능해져서 1과 3만 따로 if 문으로 해결.
5. 5를 나눈 몫과 2를 나눈 몫을 더해 count 변수에 저장하고, 그것을 출력한다.
일단 처음 무작정 해봤다. 올빼미 족이 아니라서.. 1시에 졸면서 했더니 아무생각없이 만든것 같다.
#include <stdio.h>
int main()
{
int n,m;
int cnt = 0;
scanf("%d", &n);
m = n % 5;
if (n == 1 || n == 3)
{
printf("-1");
}
else
{
cnt = n/5 + m/2;
printf("%d", cnt);
}
}
여기에서 좀 고쳐야 할건, 13을 넣었더니 3이 나왔다. 어떻게 된 영문인지는 몰라도...작동을 제대로 안한다.
13은 5원 한개, 2원 4개로 가능하다. 무작정 5로 나누는 것이 아니었다.
만약, 앞에서 m의 값이 2로 나눠 떨어지지 않는다면 5에서 한개를 빼고, m에 다시 5를 더한 후에 2로 나눈 몫으로 cnt 값을 정해야 했다.
#include <stdio.h>
int main()
{
int n, m, h;
int cnt = 0;
scanf("%d", &n);
m = n % 5;
h = m % 2;
if (n == 1 || n == 3)
{
printf("-1");
}
else if(h == 0)
{
cnt = n/5 + m/2;
printf("%d", cnt);
}
else
{
cnt = (n / 5 - 1) + (m + 5) / 2;
printf("%d", cnt);
}
}
수정본인데 자면서 해서 else 문을 중괄호 안하고 소괄호로 해서 틀렸다.
이런 실수는 제발 안했으면,,,

맞았다.........ㅎ
1번 문제가 생각보다는 엄청 어렵지는 않았지만......