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 |