문제

https://www.acmicpc.net/problem/2839
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//N입력
int N = Integer.parseInt(bf.readLine());
if (N == 3) {
System.out.println(1);
return;
}
if (N == 4 || N == 7) {
System.out.println(-1);
return;
}
int five = 0;
int remain = 0;
int three;
if (N >= 5) {
five = N / 5;
remain = N % 5;
}
//point1
while (remain % 3 != 0) {
five--;
remain += 5;
//point2
if (remain > N) {
System.out.println(-1);
return;
}
}
three = remain / 3;
System.out.println(five + three);
}
}
풀이 방법
five
,three
:5kg
의 설탕 주머니,3kg
의 설탕 주머니의 개수
remain
: N을 5로 나눈 나머지
💡
예를 들어 N이 11이라면?
- 최초에 11을 5로 나눠서
five = 2
, 그에 대한remain = 1
로 결정된다.
remain
에 대해 3으로 나눈 몫을 구하려고 하지만, 1은 3으로 나눴을 때 0이 되지 않는다.
- 따라서 최초에
five=2
로 잡았던 결정을 뒤로 돌려five = 1
, 그리고 그에 따라remain = 6
인 경우에 대해서 확인한다.
- 6에 대해서는 3으로 나누어 떨어지기 때문에 조건을 만족한다.
- 따라서 결과는
five = 1
,three = 2
로 결정된다.
핵심 포인트
- 만약 3kg과 5kg으로 N이 이루어지지 못한다면 -1로 출력하는 것은 어떻게?
- 위 코드의
point1
과정에서 만약 4, 7과 같은 조건을 만족하지 못하는 N이 입력으로 들어오는 경우,remain
이N
보다 커지는 경우 발생했음.
- 따라서
remain
이N
보다 커진다면,-1
을 출력하도록 구현
- 위 코드의
- 반례 처리
- 4, 7에 대해 하드코딩으로 반례를 처리함.
- 마찬가지로 3에 대해서도 하드코딩으로 반례를 처리함 → 미처리시 3을 입력했을 때 0이 출력됨. 이 부분에 대한 반례를 찾지 못해 시간을 쏟았다가 찾은 후에 하드코딩으로 처리
보완할 점 / 느낀 점
- 반례찾는 연습
- 수학적 접근에 대한 학습
→ 현재는 11과 같은 숫자를 처리하기 위해 whlie문을 사용하였으나, 아래와 같이 O(1)로 만들 수도 있다.
참고 자료