
Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고,
추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!

Digits Product
숫자들의 곱
문제를 보겠습니다.

문제를 보시면, 잘 이해가 안갑니다.

이 문제에 대한 평가를 봐도 이해가 됩니다. 제가 보기엔 설명이 부족한 것 같습니다.
이 문제를 해석하면, 주어진 Interger Product 가 있다고 합니다. 번역하면, 숫자의 곱입니다.
즉 test1을 보면 12는 어떤 숫자들의 곱인 것이죠. 여기서 무언가를 찾으라고 합니다.
find smallest positive integer the product of whose digits is equal to product.
주어진 곱과 같은 결과가 나오는 숫자들의 곱을 가장 작은 것으로 찾아달라는 것입니다.
이게 대체 뭔말인지 이해하는 시간이 한참 이었습니다. 저도 기억이 아련하지만,,,
제 기억도 도저히 이해가 되질 않아 Example 을 보며 이해하려 했건만
product = 12, digitsProduct = 26이라는 어처구니 없는 예시가 있더군요.
그러면 생각해봅시다.
12의 곱은 1*12, 2*6, 3*4 가 있습니다. 굳이 나누면, 2*2*3 도 있겠네요.
여기서 봤을 때, return 값이 26인 것을 보니 2*6 을 원하는 거 같았습니다. 그런데, 19를 보면, Return 값이 -1 입니다.
조건이 no such integer , return -1 instead. 때문입니다. 여기서 좀 눈치를 챘습니다.
즉, 1 * 19 밖에 없는 19는 19가 0~9인 digit 이 아니라는 것입니다.
이렇게 이해하고 보니 다른 테스트들이 이해가 되었습니다.
어느정도 감이 오셨으리라 믿고, 답안을 보겠습니다.
int digitsProduct(int product) {
List <Integer> divisor1 = new ArrayList<Integer>();
StringBuilder re = new StringBuilder();
int show = product ;
if(product == 0){System.out.println("0은 >> "+10);return 10;}
else if(product == 1){System.out.println("1은 >> "+1);return 1;}
else if(product != 0 && product != 1){
for(int i = 9; i>=1; ){
if(product%i==0){
product = product/i;
divisor1.add(i);
System.out.println(divisor1+"==> "+i);
i = 10;}
i--;
if(i == 1)break;
}
int mul = 1;
for(int a : divisor1){
mul *= a;
}
if(mul != show){
return -1;
}
System.out.println(divisor1);
}else{
return 10;
}
for(int i = divisor1.size()-1 ; i>=0; i--){
re.append(divisor1.get(i));
}
return Integer.parseInt(re.toString());
}
먼저, 큰 개념은 9부터 나누는 것입니다.
큰 값부터 나눌 수 있는 숫자를 통해 최대한 대상의 값을 낮춰 줍니다. 그리고 그러한 값들을 리스트화 해준뒤,
거꾸로 붙여서 리턴해주면 됩니다.
for(int i = 9; i>=1; ){
if(product%i==0){
product = product/i;
divisor1.add(i);
System.out.println(divisor1+"==> "+i);
i = 10;}
i--;
if(i == 1)break;
}
이 반복문을 보면, product 를 9로 나누기 시작합니다.
나눠 지면, 그 해당 i를 divisor1 리스트에 넣어주고, product는 product/i로 재설정 해줍니다.
안나눠지면, 그냥 넘어가고 i를 -1해줍니다.
이런식으로 반복문을 돌리면, 최종 i 가 1이 되는 순간 반복문을 빠져 나옵니다.
이렇게 되면, list안에는 12와 243 을 예를 들었을때, 아래 output 과 같이 리스트가 쌓이게 됩니다.
약간 이해가 되실 겁니다. 12의 경우 [6, 2] 가 최종적 리스트가 되었고,
243의 경우 [9, 9, 3] 이 최종 리스트가 되었습니다.


이 최종 리스트들을 거꾸로 리턴해주면 , 26, 399 정답과 동일해집니다.
이런식으로 푸는 문제였으면, 다른 경우의 수는 위의 if문을 통해 걸어준다고 보면 됩니다.
이제 엘리트 분들의 답안을 감상하자...
JAVA
int digitsProduct(int product)
{
if (product == 0)
return 10;
if (product < 10)
return product;
String r = "";
for (int d = 9; d > 1; d--)
for (; product % d == 0; product /= d)
r = d + r;
return product == 1 ? new Integer(r) : -1;
}
이 분은 반복문의 조건이 특이하게 걸어서 r = d+r 을 하는 특이한 방법을 쓰셨네요.. 그리고
return 을 ? 문을 이용해서 답을 이끌어냈습니다. 이 방법이 훨씬 좋습니다.;
Python3
def digitsProduct(p):
if p == 0:
return 10
elif p == 1:
return 1
n = []
while 1 < p:
for d in range(9, 1, -1):
if p % d == 0:
p /= d
n.append(d)
break
else:
return -1
return int(''.join(map(str, sorted(n))))
파이썬의 경우 비슷한 방식이고, return 에서 join(), map(), sorted() 함수를 통해 간단하게 답을 이끌어냈습니다.
역시 간편하네요.
JS
function digitsProduct(product) {
if (product == 0) return 10;
if (product == 1) return 1;
var divisor = 10,
power = 1,
result = 0;
while (product > 1) {
if (--divisor == 1) return -1;
while (product % divisor == 0) {
product /= divisor;
result += divisor * power;
power *= 10;
}
}
return result;
}
공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'Algorithm > Java' 카테고리의 다른 글
#57_Code Signal Arcade >> File Naming (0) | 2020.07.14 |
---|---|
#55_Code Signal Arcade >> Different Squares (0) | 2020.07.09 |
#54_Code Signal Arcade >> Sum Up Numbers (0) | 2020.07.08 |