백준 1356 - 유진수

2021-01-30
문제

유진수는 어떤 수를 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를 출력한다.

조금만 생각해보면 어렵지 않게 풀 수 있는 문제다. for문이나 while문을 이용해 첫 자리부터 탐색하며 양쪽 숫자의 자리수의 곱이 같은지 확인하면 된다.

관건은 각 자리수의 곱을 구하는 것. 여기선 내장 함수 evalstr 클래스의 join 메소드를 활용했다.

n = input()
for i in range(len(n)-1):
    k = eval('*'.join(str(i) for i in n[:i+1])) # 앞 자리수의 곱
    s = eval('*'.join(str(i) for i in n[i+1:])) # 뒤 자리수의 곱
    if k == s:
        print('YES')
        break
else:
    print('NO')

[문제 보기]