본문 바로가기
Algorithm Problem Solving/BaekJoon

[BaekJoon] 백준 1356 유진수 (Python / 파이썬)

by ʚ⇜❅🎕̈❄⇝ɞ 2021. 8. 22.
728x90
반응형

BaekJoon 백준 1356 유진수 문제는 유진수는 어떤 수를 10진수로 표현한 뒤 그 수를 두 부분으로 나눴을 때, 앞부분 자릿수의 곱과 뒷부분 자릿수의 곱이 같을 때를 말한다. 어떤 수 N이 주어질 때, 이 수가 유진수인지 아닌지 구하는 문제이다. 난이도는 Bronze 1이다.

 

BaekJoon 1356 유진수 문제 정보

출처

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

알고리즘 분류

- 수학, 사칙연산, 문자열, 구현

난이도

- 브론즈 1 / Bronze 1

 

유진수 문제 요약

  • 유진수는 어떤 수를 10진수로 표현한 뒤 그 수를 두 부분으로 나눴을 때, 앞부분 자릿수의 곱과 뒷부분 자릿수의 곱이 같을 때를 말한다.
  • 예를 들어, 1221은 유진수이다. 12와 21로 나눴을 때, 앞부분 자릿수의 곱 1*2는 뒷부분 자릿수의 곱 2*1과 같기 때문이다. 1236도 마찬가지로 유진수이다. 하지만, 1234는 아니다.
  • 수를 나눌 때 항상 연속된 자릿수를 나눠야 하고, 각 부분에 적어도 한자리는 있어야 한다.
  • 예를 들어, 12345는 총 4가지 방법으로 나눌 수 있다. 1-2345, 12-345, 123-45, 1234-5
  • 어떤 수 N이 주어질 때, N이 유진수이면 YES, 아니면 NO를 출력한다. N은 2,147,483,647 보다 작거나 같은 자연수이다.

 

문제 풀이 과정

  1. 입력받은 수를 한 자리 씩 리스트에 저장한다.
  2. N의 길이가 1이면 유진수가 아니므로 NO를 출력한다.
  3. 아니면 수를 모든 방법으로 나누면서 앞부분의 곱과 뒷부분의 곱을 비교하여 같다면 수 나누기를 중단하고 YES를 출력하고, 나누기가 끝났는데도 같은 경우가 없다면 NO를 출력한다.

이때 주의할 점은 정수를 나눌 때 0이 무시되지 않게 주의해야 한다.

그리고 한 자리 수일 때를 고려하지 않아서 틀렸었다.

 

코드 및 설명
N = list(map(int, input()))
nLen = len(N)

# 한자리 수면 유진수가 아님
if nLen == 1:
    print('NO')
else:
    a = b = 1
    # 각 부분으로 나누기
    for i in range(nLen - 1):
        a = b = 1
        # 나뉜 수의 앞부분 곱하기
        for j in range(i + 1):
            a *= N[j]
        # 나뉜 수의 뒷부분 곱하기
        for k in range(i + 1, nLen):
            b *= N[k]
        # 앞부분과 뒷부분의 곱이 같다면
        if a == b:
            break
    
    if a == b:
        print('YES')
    else:
        print('NO')

BaekJoon 백준 1356 유진수 문제를 파이썬 python으로 풀어보았다. 난이도는 Bronze 브론즈 1이다. 

728x90
반응형

댓글