본문 바로가기

백준/C++

[Baekjoon/C++] 1356번 - 유진수

Baekjoon Online Judge

문제로 이동

 

문제

유진수는 어떤 수를 10진수로 표현한 뒤 그 수를 두 부분으로 나눴을 때, 앞부분 자리수의 곱과 뒷부분 자리수의 곱이 같을 때를 말한다.

예를 들어, 1221은 유진수이다. 12와 21로 나눴을 때, 앞부분 자리수의 곱 1*2는 뒷부분 자리수의 곱 2*1과 같기 때문이다. 1236도 마찬가지로 유진수이다. 하지만, 1234는 아니다. 수를 나눌 때 항상 연속된 자리수를 나눠야하고, 각 부분에 적어도 한자리는 있어야 한다.

예를 들어, 12345는 총 4가지 방법으로 나눌 수 있다. 1-2345, 12-345, 123-45, 1234-5 어떤 수 N이 주어질 때, 이 수가 유진수인지 아닌지 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 수 N이 주어진다. 이 수는 2,147,483,647보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 N이 유진수이면 YES, 아니면 NO를 출력한다.

 


예제 입력 예제 출력
1236 YES
1 NO
1221 YES
4729382 NO
42393338 YES

풀이

#include <iostream>
using namespace std;

int main() {
    string N;
    cin >> N;

    bool isYou = false; // 유진수 여부
    int m1 = 1; // 앞부분 자리수의 곱

    for (int i = 0; i < N.length() - 1; i++) {
        m1 *= N[i] - '0';

        // 뒷부분 자리수의 곱
        int m2 = 1;
        for (int j = i + 1; j < N.length(); j++)
            m2 *= N[j] - '0';

        // 유진수인지 확인한다.
        if (m1 == m2) {
            isYou = true;
            break;
        }
    }

    // 출력
    if (isYou == true)
        printf("YES\n");
    else
        printf("NO\n");

    return 0;
}

숫자를 string으로 받아서 원하는 자릿수의 숫자를 바로바로 뽑아서 사용할 수 있게 했다. 이중 for문을 이용해서 앞부분 자리수의 곱과 뒷부분 자리수의 곱을 계산했으며, 만약 두 곱의 값이 같다면 유진수 여부를 확인하는 변수인 isYou를 true로 바꾸고 반복문을 종료시켰다. 그리고 isYou의 값에 따라 출력 결과가 달라지게끔 했다.

'백준 > C++' 카테고리의 다른 글

[Baekjoon/C++] 1362번 - 펫  (0) 2022.05.21
[Baekjoon/C++] 1357번 - 뒤집힌 덧셈  (0) 2022.05.21
[Baekjoon/C++] 1350번 - 진짜 공간  (0) 2022.05.21
[Baekjoon/C++] 1333번 - 부재중 전화  (0) 2022.05.21
[Baekjoon/C++] 1297번 - TV 크기  (0) 2022.05.21