두 개의 미지수 x, y를 가지는 연립 일차방정식의 해를 찾는 문제입니다. 이 문제는 수학 공식을 이용해 풀 수도 있지만, 문제에 주어진 x와 y의 값 범위라는 결정적인 힌트를 활용하여 브루트포스(Brute-force) 방식으로 간단하게 해결할 수 있습니다.
항목 | 내용 |
---|---|
문제 번호 | 19532번 - 수학은 비대면강의입니다 |
난이도 | 브론즈 2 |
핵심 알고리즘 | 구현, 브루트포스(완전탐색) |
a, b, c, d, e, f
여섯 개의 정수가 한 줄에 공백으로 구분되어 주어집니다. (-999 ≤ a,b,c,d,e,f ≤ 999)ax + by = c
, dx + ey = f
를 만족시키는 유일한 정수 해 x
, y
를 공백으로 구분하여 출력합니다.x
와 y
는 -999 이상 999 이하의 정수입니다.이 문제는 연립방정식의 해를 구하는 공식을 몰라도 풀 수 있습니다. 문제에서 "x와 y는 -999 이상 999 이하의 정수"라는 매우 강력한 힌트를 주었기 때문입니다.
x
와 y
의 후보가 각각 -999부터 999까지로 매우 좁게 한정되어 있습니다.(x, y)
조합을 직접 다 확인해봐도 시간 안에 충분히 답을 찾을 수 있다는 의미입니다.x
와 y
의 조합을 하나씩 두 방정식에 대입해본다.for
반복문을 사용하여 모든 경우의 수를 탐색합니다.for
문: x
를 -999부터 999까지 1씩 증가시킵니다.for
문: y
를 -999부터 999까지 1씩 증가시킵니다.(x, y)
를 찾는 즉시 그 값을 출력하고 프로그램을 종료하면 됩니다.a, b, c, d, e, f
를 입력받습니다.x
에 대한 for
반복문을 -999부터 999까지 실행합니다.y
에 대한 for
반복문을 -999부터 999까지 중첩하여 실행합니다.if ((a*x + b*y == c) && (d*x + e*y == f))
조건을 확인합니다.x
와 y
가 정답이므로 출력하고 프로그램을 즉시 종료합니다. (return
또는 break
활용)예시: 3x - y = -1, 4x + y = 15
(a=3, b=-1, c=-1, d=4, e=1, f=15)
1. x=-999, y=-999
부터 대입 시작
2. ... (수많은 시도) ...
3. x=2, y=7
일 때:
- 3*2 + (-1)*7 = 6 - 7 = -1
(첫 번째 식 성립)
- 4*2 + 1*7 = 8 + 7 = 15
(두 번째 식 성립)
4. 두 식 모두 성립하므로 2 7을 출력하고 즉시 프로그램을 종료합니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
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());
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부터 999까지 모두 탐색
for (int x = -999; x <= 999; x++) {
for (int y = -999; y <= 999; y++) {
// 두 방정식을 모두 만족하는지 확인
if ((a * x + b * y == c) && (d * x + e * y == f)) {
bw.write(x + " " + y);
// 답을 찾았으므로 즉시 종료
bw.flush();
bw.close();
br.close();
return;
}
}
}
}
}
항목 | 설명 |
---|---|
범위의 중요성 | 이 문제가 브루트포스로 풀리는 유일한 이유는 해의 범위가 -999 ~ 999로 작게 고정되어 있기 때문입니다. 범위가 주어지지 않았다면 이 방법은 시간 초과로 절대 사용할 수 없습니다. |
수학적 풀이 | 중학교 수학에서 배우는 연립방정식의 해법(가감법, 대입법)이나 크라메르 공식을 이용하면 O(1)의 시간 복잡도로 즉시 답을 구할 수 있습니다. x = (ce - bf) / (ae - bd) , y = (af - cd) / (ae - bd) |
조기 종료 | 답은 유일하므로, 답을 찾는 즉시 return 이나 System.exit(0) 를 사용해 불필요한 연산을 줄이는 것이 좋습니다. 이중 for 문을 break 로 탈출하는 방법도 있습니다. |
연산 횟수 | x 의 범위 약 2000개, y 의 범위 약 2000개이므로 총 연산 횟수는 약 2000 * 2000 = 4,000,000 번입니다. 이는 1초의 시간 제한 안에 충분히 통과 가능한 횟수입니다. |
✔️ 문제에 주어진 변수의 범위는 매우 중요한 힌트가 될 수 있습니다.
✔️ 해의 탐색 범위가 충분히 작다면, 복잡한 수학 공식 대신 브루트포스(완전탐색)로 모든 경우를 시도하는 것이 간단하고 효과적인 해결책이 될 수 있습니다.
✔️ 이중 for
문을 사용해 x
와 y
의 모든 조합(-999 ~ 999)을 만듭니다.
✔️ 두 방정식을 모두 만족하는 (x, y)
를 찾으면 즉시 출력하고 프로그램을 종료하는 것이 효율적입니다.