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 보다 작거나 같은 자연수이다.
문제 풀이 과정
- 입력받은 수를 한 자리 씩 리스트에 저장한다.
- N의 길이가 1이면 유진수가 아니므로 NO를 출력한다.
- 아니면 수를 모든 방법으로 나누면서 앞부분의 곱과 뒷부분의 곱을 비교하여 같다면 수 나누기를 중단하고 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
반응형
'Algorithm Problem Solving > BaekJoon' 카테고리의 다른 글
[BaekJoon] 백준 2999 비밀 이메일 (Python / 파이썬) (0) | 2021.08.22 |
---|---|
[BaekJoon] 백준 2954 창영이의 일기장 (Python / 파이썬) (0) | 2021.08.22 |
[BaekJoon] 백준 9455 박스 (Python / 파이썬) (0) | 2021.08.22 |
[BaekJoon] 백준 10769 행복한지 슬픈지 (Python / 파이썬) (0) | 2021.08.22 |
[BaekJoon] 백준 5533 유니크 (Python / 파이썬) (0) | 2021.08.21 |
댓글