(C++) 백준 1356번 - 유진수

코딩너구리·2025년 9월 29일

코딩 문제 풀이

목록 보기
6/266

https://www.acmicpc.net/problem/1356

유진수란?

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

문제

> 예를들어 12345는 총 4가지 방법으로 나눌수 있다.
> 1-2345, 12-345, 123-45, 1234-5
> 어떤 수 N이 주어질 때 이 수가 유진수 인지 아닌지 구해라.

접근

각 자리 수를 인덱스로 하여 반복문을 돌며 유진수 판별 계산식을 적용해 판단한다.

문제 해결

> substr(시작위치, 길이)를 이용해 문자열을 잘라 각각 유진수 검증 함수에 넣고 판별한다.
> 검증되어 나온 값끼리 비교하여 같다면 YES, 아니면 NO를 출력한다.

코드

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int calcN(string s)
{
	int result = 1;
	for (int i = 0; i < s.length(); i++)
	{
		result *= (s[i] - '0');
	}
	return result;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	string N;
	cin >> N;
	
	for (int i = 1; i < N.length(); i++)
	{
		if (calcN(N.substr(0, i)) == calcN(N.substr(i, N.length() - i)))
		{
			cout << "YES" << '\n';
			return 0;
		}
	}
	cout << "NO" << '\n';
}


후기

문자열을 원하는 길이만큼 잘라낼 수 있는 substr에 대해 알게 되었다.
N의 범위가 2,147,483,647이라는 조건을 보고 자료형의 크기에 대해 찾아보았다. int 형은 -2,147,483,648 ~ 2,147,483,647 까지라고 한다.
계속 틀리길래 온 코드를 뒤졌더니 YES, NO를 소문자로 해서였다.. 신경써서 잘 보자

0개의 댓글