[BaekJoon/백준] 2839번

Hevton·2020년 9월 8일
0
post-custom-banner

해당 문제는 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보다 작거나 같아질 때 까지 반복하는 방식이다.

정말 똑똑하다. 나는 이런 수학적 사고방식이 너무 부족한 것 같아서 벽을 느낀다...내 한계 극복을 위해 열심히 공부해야겠다.

profile
놀만큼 놀았다.
post-custom-banner

0개의 댓글