이 문제는 어떤 정수 A가 있으면 그 수를 A = a1 * a2 * a3 * a4 ... * an으로 했을 때 A' = a1 + a2 + a3 ... + an이 성립하면 "A는 A'으로 변할 수 있다"라고 한다. (ai는 정수) 만약 A'이 A"으로 변할 수 있으면 "A는 A"으로 변할 수 있다"라고 하는데, 이때 A와 B가 주어지면 A는 B로 변할 수 있는지 판별하는 문제입니다.
#include <stdio.h>
int main() {
int T, a, b;
scanf("%d", &T);
for(int i = 1; i <= T; i++){
scanf("%d %d", &a, &b);
printf("yes\n");
}
return 0;
}
먼저 코드를 보면 뭔가 계산하는 식도 없고 조건문도 없습니다. 일단 테스트케이스의 수(T)를 입력하고 테스트케이스의 수만큼 두 수(a, b)를 입력합니다. 그리고 yes\n만을 출력합니다.
예제를 보면
1
6 5
yes
인데 이것은 6 = 2 * 3으로 나타낼 수 있고, 2 + 3 = 5가 성립하기 때문입니다.
만약 두 수 5 6이 주어졌다면 5 = 1 * 5, 1 + 5 = 6 이므로 yes가 출력되어야 합니다.
그렇다면 두 수 5 999999999999가 주어져도 성립하게 됩니다.
왜냐하면 5 = 1 * 1 * 1 * ... * 5, 1 + 1 + 1 + ... + 5 = 999999999999 가 가능하기 때문입니다.
그리고 두 수 5 -6이 주어지면
5 = -1 * -1 * -1 * ... * 5, -6 = - 1 + -1 + -1 + ... 5도 가능합니다.
따라서 이 문제에서는 어떤 두 수가 입력되어도 성립하기 때문에 두 수를 입력받고 yes를 출력하기만 하면 됩니다.
이 문제를 접하고 소인수분해를 이용할 생각부터 했습니다. 그렇게 모든 경우의 수를 구하는 게 매우 어려웠는데 사실은 모든 경우가 yes라는 것을 이해하고 나니 문제가 쉬워졌습니다. 왜 모두 참인지 찾아 이해하는 것이 가장 오래 걸렸는데 생각을 많이 하도록 만들어진 좋은 문제라고 생각합니다.
C언어 재귀함수와 피보나치 수열 (0) | 2023.04.16 |
---|---|
C언어 함수 (0) | 2023.04.14 |
백준 1598번 꼬리를 무는 숫자 나열 c (0) | 2023.04.09 |
백준 8958번 OX퀴즈 c (0) | 2023.04.09 |
백준 2609번 최대공약수와 최소공배수 c (0) | 2023.04.09 |