문제
https://www.acmicpc.net/problem/2839
단순히 나누고 나머지 계산하면 되는 문제라고 생각했는데,,,
코드
using System;
using System.Text;
using System.Collections.Generic;
namespace baekjoon
{
class Algorithm
{
static void Main(string[] str)
{
int input = int.Parse(Console.ReadLine());
int cnt = 0;
while(true)
{
if(input%5 == 0)
{
cnt += input/5;
Console.Write(cnt);
break;
}
else
{
if(input < 3)
{
Console.Write("-1");
break;
}
input -= 3;
cnt++;
}
}
}
}
}
고민
나는 냅다 5로 나눠지면 나머지를 3으로도 나누고.. 안되면 -1 출력하고.. 단순하게 생각했다. 사실 이 문제에서 우리가 생각해야 할 것들이 많다.
1. 5와 3으로 모두 나눠지는 경우
2. 5로만 나눠지는 경우
3. 3으로만 나눠지는 경우
4. 모두 나눠지지 않는 경우(나머지가 생기는 경우)
우선 1번을 생각했을때 단순 if문으로 와다닥 만들면 정말 복잡해진다.
우리는 가장 적은 포대를 옮기면 된다. 그렇기 때문에 5로 최대한 많이 나눠주면 되는데, 5로 나누어지지 않는 수가 들어온다면 어떻게 할건가? 작은수인 3을 활용해서 최대한 5의 배수를 만들어 준 다음에 5의 배수가 나오면 5로 나누어버리고 몫의 개수를 카운트하면 된다.
ex) 27이 들어온다면?
27 - 3 = 24
24 - 3 = 21
21 - 3 = 18
18 - 3 - 15 ===> 드디어 5의 배수가 되었다.
그렇다면 15 / 5 = 3
5kg은 3개, 3kg은 3개가되므로 총 6을 출력하면 된다.
5로만 나누어진다면 그냥 5의 몫을 출력하면 되고
3으로만 나누어진다면 3을 열심히 빼면서 뺀만큼 cnt하고.. 다 나누어지면 cnt를 출력하면 된다.
마지막 모두 나눠지지 않는 경우는
5의 배수로 만들어주기위해 3을 계속 뺄건데, 어? 빼다보니 3으로도 못빼네? 이러면 이제 나머지가 남는다는 의미니까
바로 -1을 출력하면 된다.
나누기를 마이너스라고 생각해서 문제를 푸는 수학천재를 어쩌면 좋을까. 계속되는 실패에 검색을 해봤더니 어떤 천사분이 나누기를 마이너스라고 생각하라는 힌트를 주셔서 샥샥 풀어봤다. 자료구조 파트 잘 풀리다가 갑자기 수학파트 넘어와서 자신감이 사라졌다. 하지만 열심히 하자! 아자아자!
'동식이 취업시키기 작전 > 코딩테스트' 카테고리의 다른 글
[백준] 1065 한수(C#) (1) | 2024.01.25 |
---|---|
[백준] 4673 셀프넘버(C#) (0) | 2024.01.25 |
[백준] 4949 균형잡힌 세상(C#) (0) | 2024.01.24 |
[백준] 1764 듣보잡(C#) (0) | 2024.01.24 |
[백준] 11866 요세푸스(C#) (1) | 2024.01.23 |