문제
주어진 숫자를 두 부분으로 나누었을 때, 각 부분의 자릿수 곱이 같으면 유진수이다. 유진수인지 판별하라.
입력
첫째 줄에 수가 주어진다.
출력
유진수이면 "YES", 아니면 "NO"를 출력한다.
예제
| 입력 | 출력 |
|---|---|
1236 | YES |
풀이
모든 분할 위치에서 왼쪽과 오른쪽 자릿수의 곱을 비교한다.
- 숫자를 자릿수 배열로 변환한다
- 위치 1부터 길이-1까지 분할하여 왼쪽과 오른쪽으로 나눈다
- 각 부분의 자릿수 곱을 계산하여 일치하면 "YES"를 반환한다
핵심 아이디어: 자릿수가 최대 10자리 이하이므로 모든 분할을 확인해도 O(N²)으로 충분하다.
코드
const solution = (input) => {
const str = input[0].split("").map(Number);
for (let i = 1; i < str.length; i++) {
const front = str.slice(0, i).reduce((acc, cur) => acc * cur, 1),
back = str.slice(i).reduce((acc, cur) => acc * cur, 1);
if (front === back) return "YES";
}
return "NO";
};
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
console.log(solution(input));복잡도
- 시간: O(N²)
- 공간: O(N)