해당 문제는 3x + 2y = c 에서 c 값이 주어졌을 때 x+y의 최소값을 구하라는 문제이다. 나는 이 문제를 코드로 구현하는데 있어서 모든 해를 구한 뒤에 x+y의 최소를 가려내는 식으로 다소 복잡한 방식으로 코딩을 했는데, 다른 고수 분께서는 이런 불필요한 과정을 모두 사용하지 않고 되게 간결하며 수월한 방법으로 푸셔서 두 코드를 비교하며 공부해 보려고 한다.
아래는 지저분한 내 코드이다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class suger {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
int total = scan.nextInt();
ArrayList<Integer> in = new ArrayList<Integer>();
for(int i = 0; i <= total/5 ; i++) {
for(int j = 0; j <= total/3; j++) {
if(5*i+3*j==total)
in.add(i+j);
}
}
int[] arr = in.stream().mapToInt(i->i).toArray();
Arrays.sort(arr);
if(in.size()!=0)
System.out.print(arr[0]+"");
else
System.out.print("-1");
}
}
5x + 3y = c의 모든 경우의 수를 이중 포문으로 돌리면서 해를 구하고, 구한 해 x,y의 합을 ArrayList Integer 형 변수에 저장한다.
그리고 Arrays 클래스의 sort함수(오름차순 정렬함수)를 사용하기 위해서 ArrayList Integer 형 변수를 int[] 형 변수로 변환하는 과정을 넣었다. 코드에서 다소 불필요한 내용들이 많다. 내가 코딩을 하고 제출을 하면서도, 더 좋은 방법이 분명히 있을 것 같은데, 나의 부족한 실력으로 인해 이끌어내진 못했다.
아래는 고수분의 간결한 코드이다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 0;
while (true) {
if (n % 5 == 0 && n >= 0) {
System.out.println(n / 5 + count);
break;
} else if (n < 0) {
System.out.println(-1);
break;
}
n = n - 3;
count++;
}
}
}
정말 간결하다. 5가 3보다 큰 수 이므로 일단 5로 먼저 나누어 떨어지는지 확인하고, 아니라면 수를 3씩 감소시켜보며 반복하는 방식이다.
다시 말하면, 5로 나누어 떨어지는 경우가 오면 3으로 떨어질 때 보다 당연히 x+y가 최소가 되므로 끝난거고, 그게 아니라면 수를 3씩 감소시키면서(식에서 3y의 y값을 점점 증가시키는 느낌) 다시 5로 나누어 떨어질때 까지 또는 그러다 n이 0보다 작거나 같아질 때 까지 반복하는 방식이다.
정말 똑똑하다. 나는 이런 수학적 사고방식이 너무 부족한 것 같아서 벽을 느낀다...내 한계 극복을 위해 열심히 공부해야겠다.