알고리즘

[백준, 자바, 19532번] 수학은 비대면강의입니다

hminor 2024. 11. 11. 18:51

풀이

  • 해당 문제는 직접 풀이하면 간단하지만,
  • 뭔가 알고리즘으로 해결하려고 생각하니 까다로운 점이 있어서
  • 시간이 걸렸다.
  • 처음 접근할 때는, 주어지는 입력값에 0이 있다는 것을 
  • 어디까지 생각해야 하는지에 대한 혼동으로 우선은
  • 모든 값에 0이 아닌 정수가 있다는 것으로 픽스를 하여
  • a와 d를 기준으로 잡고 같은 값으로 만들기 위해 
  • 우선 GCD로 최대공약수를 찾아 그에 맞게 각 방정식의 값을 변경 후 x,y 값을 찾기
  • 이후 모든 경우를 생각해서 각 방정식에 0의 정수가 하나씩 모두 있는 경우와
  • 한 방정식에 있는 경우에 대한 조건 분기 후 처리하여 해당 문제를 해결.

 

import java.io.*;
import java.util.*;

public class _19532 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        int d = Integer.parseInt(st.nextToken());
        int e = Integer.parseInt(st.nextToken());
        int f = Integer.parseInt(st.nextToken());

        int x = 0;
        int y = 0;
        if ((zero(a) || zero(b)) && (zero(d) || zero(e))) {
            if (zero(a)) y = c/b;
            else x = c/a;
            if (zero(d)) y = f/e;
            else x = f/d;
        } else if (zero(a) || zero(b)) {
            if (zero(a)) {
                y = c/b;
                x = (f-e*y)/d;
            }
            else {
                x = c/a;
                y = (f-d*x)/e;
            }
        } else if (zero(d) || zero(e)) {
            if (zero(d)) {
                y = f/e;
                x = (c-b*y)/a;
            }
            else {
                x = f/d;
                y = (c-a*x)/b;
            }
        } else {
            int moc = GCD(a,d);
            int tmp = a;
            a = a*(d/moc);
            b = b*(d/moc);
            c = c*(d/moc);
            d = d*(tmp/moc);
            e = e*(tmp/moc);
            f = f*(tmp/moc);
            y = (c-f)/(b-e);
            x = (c-b*y)/a;
        }
        System.out.println(x);
        System.out.println(y);
    }

    public static boolean zero(int num) {
        return num==0;
    }

    public static int GCD(int n1, int n2) {
        int tmp = 0;
        while (n2!=0) {
            tmp = n1%n2;
            n1 = n2;
            n2 = tmp;
        }
        return n1;
    }
}