[백준] 19532번: 수학은 비대면강의입니다 - c++

삼식이·2025년 2월 10일
0

알고리즘

목록 보기
33/81

수학은 비대면강의입니다

문제

입력

출력

예제

문제 정의

처음에는 사칙 연산 하듯이 나누는 과정을 그대로 식으로 만들면 된다고 생각했다.

<처음 코드>

#include<bits/stdc++.h>
using namespace std;
int a, b, c, d, e, f;
int x, y;
int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> a >> b >> c >> d >> e >> f;
  if (a >= d) {
    y = c - a / d * f / (b - a / d * e);
    x = (c - b * y) / a;
  }
  else
  {
    y = (d / a * c - f) / (d / a * b - e);
    x = (c - b * y) / a;
  }
  cout << x << " " << y << "\n";
}

시간이 좀 걸리긴 했지만 예제에서 잘 돌아가서 맞게 풀이 한 줄 알았다 하지만 틀렸다.

알고보니 정수 나눗셈이 의도와 다르게 동작할 가능성이 있었다!

a / d * f 같은 연산에서 a / d가 정수 나눗셈이므로 소수 부분이 버려지게 된다. 이러면 정확한 계산 결과가 나올 수 없다..

문제에서 x와 y의 범위가 -999 이상 999 이하의 정수인 경우만 입력으로 주어짐이 보장된다고 했으니 모든 x의 범위와 모든 y의 범위를 탐색하여 구하는 것이 옳다.

<맞게 다시 푼 코드>

#include<bits/stdc++.h>
using namespace std;
int a, b, c, d, e, f;
int x, y;
int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> a >> b >> c >> d >> e >> f;
  for (int i = -999; i < 1000; i++) {
    for (int j = -999; j < 1000; j++) {
      if (a*i+b*j == c && d*i+e*j == f) {
        x = i;
        y = j;
        break;
      }
    }
  }
  
  cout << x << " " << y << "\n";
}

0개의 댓글