아무래도이문제는A번난이도인것같다

백준 1402

SILVER V


  1. 문제 내용
  2. 해결 방안
  3. 풀이 코드

문제 내용

problem.png

문제 링크

해결 방안

문제의 내용을 정리하면, 정수 A를 임의의 정수들의 곱으로 나타낼 수 있다고 할 때, 그 정수들의 합이 B라면 A는 B로 변할 수 있다라고 정의한다. 언뜻 보기에는 인수 분해를 통해 그 합을 구해야할 것 같지만, 중요한 것은 문제에서는 곱으로 나타내야 하는 정수의 어떠한 조건도 주어져 있지 않다는 것이다. 이 말은 즉슨, 정수의 범위나 정수의 개수, 정수의 중복 여부까지도 어떠한 제약이 없다는 것을 의미한다.

잘만 생각해본다면, 정수 n에 1을 무한정 곱해도 n이 나오지만 곱해지는 수들의 합은 무한히 늘어날 수 있다는 것을 눈치챌 수 있다. 다시 말해, 정수 A에 대해 (A < B)가 성립하면 A는 항상 B로 변할 수 있다. 물론, A나 B가 음수인 경우에도 대소관계만 성립하면 마찬가지이다.

반대로 A보다 B가 더 작은 경우에는 어떠한 경우가 성립하는 지 고려해야 한다. 결론부터 말하자면, 이 경우에는 -1 × -1 × 1을 반복하여 곱하는 것으로 해결할 수 있다. 곱셈에 있어서는 (-1 × -1) × 1 = 1 × 1이니 무한정 곱해도 수가 늘어나지 않지만, 덧셈에 있어서는 -1 + (-1 + 1) = -1 + 0이니 -1씩 무한정 빼는 것이 가능해진다. 그래서 정수 A에 대해 (A > B)가 성립해도 A는 항상 B로 변할 수 있다.

위의 두 내용들을 정리하자면, (A < B)일 경우와 (A > B)일 경우 모두 A는 항상 B로 변할 수 있다. 당연하게도 (A = B)일 경우에는 무언가를 더 곱할 필요 없이 A = A라는 식으로 표현하면 되므로, (A = B)일 경우에도 모두 A는 항상 B로 변할 수 있다. 즉, 정수 A에 있어 B의 값과 관계없이 A는 항상 B로 변할 수 있다.

풀이 코드

#include <iostream>
using namespace std;

int main() {
    int t;
    cin >> t;

    long a, b;
    for(int i = 0; i < t; i++)
        cin >> a >> b;
        
    // A와 B의 값과 무관하게 항상 A는 B로 변할 수 있다.
    for(int i = 0; i < t; i++)
        cout << "yes\n";
    return 0;
}