상세 컨텐츠

본문 제목

백준 1402번 아무래도이문제는A번난이도인것같다 c

알고리즘/C

by 초띠 2023. 4. 9. 16:14

본문

이 문제는 어떤 정수 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' 카테고리의 다른 글

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

관련글 더보기