백준 19532번: 수학은 비대면강의입니다

레곤토르닉·2025년 8월 19일
0

BaekJoon

목록 보기
58/64
post-thumbnail

백준 19532번: 수학은 비대면강의입니다

두 개의 미지수 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를 공백으로 구분하여 출력합니다.
  • 규칙:
    • 문제에서 주어지는 연립방정식의 해는 항상 유일하며, xy는 -999 이상 999 이하의 정수입니다.

✅ 풀이 전략

이 문제는 연립방정식의 해를 구하는 공식을 몰라도 풀 수 있습니다. 문제에서 "x와 y는 -999 이상 999 이하의 정수"라는 매우 강력한 힌트를 주었기 때문입니다.

1️⃣ 핵심 단서: x와 y의 범위

  • 해가 될 수 있는 xy의 후보가 각각 -999부터 999까지로 매우 좁게 한정되어 있습니다.
  • 이는 모든 가능한 (x, y) 조합을 직접 다 확인해봐도 시간 안에 충분히 답을 찾을 수 있다는 의미입니다.

2️⃣ 브루트포스(Brute-force) 접근

  • 전략: -999부터 999까지의 모든 정수 xy의 조합을 하나씩 두 방정식에 대입해본다.
  • 구현: 이중 for 반복문을 사용하여 모든 경우의 수를 탐색합니다.
    • 바깥쪽 for문: x를 -999부터 999까지 1씩 증가시킵니다.
    • 안쪽 for문: y를 -999부터 999까지 1씩 증가시킵니다.
  • 종료 조건: 문제에서 해는 '유일하다'고 보장했으므로, 두 방정식을 동시에 만족하는 (x, y)를 찾는 즉시 그 값을 출력하고 프로그램을 종료하면 됩니다.

3️⃣ 알고리즘 설계

  1. 6개의 계수 a, b, c, d, e, f를 입력받습니다.
  2. x에 대한 for 반복문을 -999부터 999까지 실행합니다.
  3. y에 대한 for 반복문을 -999부터 999까지 중첩하여 실행합니다.
  4. 반복문 안에서 if ((a*x + b*y == c) && (d*x + e*y == f)) 조건을 확인합니다.
  5. 조건이 참이면, 해당 xy가 정답이므로 출력하고 프로그램을 즉시 종료합니다. (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을 출력하고 즉시 프로그램을 종료합니다.


✅ Java 코드 예제

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을 사용해 xy의 모든 조합(-999 ~ 999)을 만듭니다.
✔️ 두 방정식을 모두 만족하는 (x, y)를 찾으면 즉시 출력하고 프로그램을 종료하는 것이 효율적입니다.

profile
기록은 나의 무기, 원칙은 나의 방패

0개의 댓글