풀이
- 해당 문제는 직접 풀이하면 간단하지만,
- 뭔가 알고리즘으로 해결하려고 생각하니 까다로운 점이 있어서
- 시간이 걸렸다.
- 처음 접근할 때는, 주어지는 입력값에 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;
}
}
'알고리즘' 카테고리의 다른 글
[백준, 자바, 7785번] 회사에 있는 사람 (0) | 2024.11.11 |
---|---|
[백준, 자바, 14425번] 문자열 집합 (0) | 2024.11.11 |
[백준, 자바, 1977번] 완전제곱수 (0) | 2024.11.10 |
[백준, 자바, 1057번] 토너먼트 (1) | 2024.11.09 |
[백준, 자바, 1541번] 잃어버린 괄호 (0) | 2024.11.08 |