[백준/2938번/java] - 설탕 배달
문제를 읽고 딱 든 생각은 최소의 갯수를 구해야하니까 5로 먼저 나누어야겠다고 생각했습니다. 그래서 처음으로 그려본 전체적인 코드의 모습은 아래 사진과 같았습니다! 공통으로 계산하는 부분도 있어서 이 부분은 메소드로 빼고 사용해야겠다~ 라고 생각하고 구현했는데..
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int count = 0;
int five = N / 5;
if(five == 0){
System.out.println(checkThree(N, count));
}else{
count += five;
int remain = N%5;
System.out.println(checkThree(remain, count));
}
}
static int checkThree(int num, int count){
if(num % 3 != 0){
return -1;
}else{
count += num/3;
return count;
}
}
}
실행 결과는 실패..!
이유가 뭘까 생각해보았을 때 6을 입력해도 9를 입력해도 -1 이 출력되기 때문이었습니다
그래서 아 그러면 기존의 방식은 그대로 가져가되, -1이 출력되는 건에 한해서만 3으로만도 나눠보자! 라고 생각했고
실제로 그렇게 코드를 구현했을 때에는 11이라는 문제점이 발견되었습니다..
5로 나눠도 -1.. 3으로 나눠도 나누어떨어지지않기 때문에 -1 출력...
그래서 다시 접근해보았습니다!!
18은 왜 4번이지에 대해 생각해보면 5+5+5+3이고 왜 11은 3이지? 생각해보면 5+3+3 이기 때문입니다.
11을 5와 3으로 표현할 수 있는 방법에 대해 나열해보자면
11 = 5+5+1 (x)
= 5+3+3(o)
= 3+3+3+2(x)
이렇게 5의 갯수를 하나씩 줄여가면서 경우들을 찾을 수 있었습니다!
그래서 나온 코드는 아래와 같습니다.
import java.util.Scanner;
public class boj_2839 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int count = -1;
for (int five = N / 5; five >= 0; five--) {
int remain = N - (five * 5);
if (remain % 3 == 0) {
count = five + (remain / 3);
break;
}
}
System.out.println(count);
}
}
먼저 주어진 숫자에서 5가 최대로 들어갈 수 있는 횟수를 알기위해 N/5 를 해줍니다. N/5 는 입력으로 받은 수 안에 5가 들어갈 수 있는 "최대" 횟수이므로 for 문을 돌면서 five 라는 변수를 하나씩 줄여주면서 나누어떨어지는 경우를 탐색합니다!
위에 11에 대해 더하기로 표현해놓은 부분을 코드로 변환한 부분이라고 생각하면 됩니다.
5로도, 3으로도 나누어떨어지는 경우에는 break 로 for 문을 빠져나오고 그때의 count 를 출력해주면 문제가 끝납니다!
끝!