문제 풀이
코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
br.close();
//첫번째 식
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());
//각각의 x, y가 -999 <= x, y <= 999이기 때문에
for(int i = -999; i <= 999; i++) {
for(int j = -999; j <= 999; j++) {
if(a*i + b*j == c){ // ax + by 가 C이고(x = i, y = j)
if(d*i + e*j == f) { // dx + ey가 f일 때(x = i, y = j)
bw.write(i + " " + j + "\n");
break;
}
}
}
}
bw.flush();
bw.close();
}
}
결과
-999 ~ 999 까지의 범위를 해를 찾을 때까지 반복하다보니까, 시간이 너무 많이 걸리는 것을 볼 수 있다.
그래서, 다른 분의 코드를 찾아봤는데, 연립방정식을 풀때 쓰는 공식인 가감법을 사용하여 소요 시간을 줄일 수 있다고 설명되었다.
가감법은 수학으로 풀 수는 있지만, 코드로 칠때는 솔직히 이해가 되지 않는다.
가감식으로 풀때의 공식은 아래와 같다고 한다.
사실 이 공식이 어떻게 나왔는지는 아직 이해하진 못했다.
코드2
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
br.close();
//첫번째 식
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());
bw.write((c*e- b*f) / (a*e - b*d) + " "); //x축
bw.write((c*d - a*f) / (b*d - a*e) +""); // y축
bw.flush();
bw.close();
}
}
결과2
느낀점
가감법 공식
첫번째 방정식 양변에 d를 곱함, 두번째 방정식 양변에 a를 곱함
위에서 나온 두 식을 가감