greenhelix
greenhelix
greenhelix
06-20 15:27
  • All (229)
    • Algorithm (118)
      • Algorithm (17)
      • Graph (0)
      • Core (6)
      • Python (18)
      • PythonSnippet (4)
      • Java (59)
      • Kotlin (14)
    • Project (0)
    • Study (8)
      • License (5)
      • EIP (3)
    • Programming (63)
      • Android (41)
      • Flutter (1)
      • Bugs Life (21)
      • Linux (0)
    • Tech (32)
      • Tech (17)
      • Drone (4)
      • Hacking (11)
    • Life (6)
      • INGRESS (1)
      • 심시티빌드잇 (0)
250x250

티스토리

hELLO · Designed By 정상우.
greenhelix

greenhelix

#41_Code Signal Arcade >> Digit Degree
Algorithm/Java

#41_Code Signal Arcade >> Digit Degree

2020. 3. 8. 00:00

Code Signal -Arcade

코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당. 

주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...

되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요! \


Digit Degree

숫자의 자릿수 ? 

처음엔 그냥 자릿수를 구하는 것인줄 알았으나,, 예시를 잘 보면 그렇지도 않았다. 

문제를 보면, positive integer = 양의 정수의 수에서 한 자릿수에 도달할 때까지 숫자의 자릿수들의 합을 계산하고, 그 작업이 반복되는 것을 횟수로 정의하여 리턴해달라는 것입니다. 

 

즉, 5라고 하면, 자릿수가 어차피 1자리 이므로 반복할 필요도 없이 0 입니다. 반복하지 않고 바로 나오니깐요. 

그렇다면, 91이라면? 

일단 한자리가 아니므로 9+1을 해줍니다. 횟수는 1이 되구요. 

 

그리고나면 10이 됩니다. 여기서 또 한자리가 아니므로, 1+0을 해줍니다. 그러면 1이 됩니다. 한자리가 되었네요. 

횟수는 2입니다. 그래서 

리턴을 2로 해줍니다. 

 

이해가 되셨나요? 

 

답안을 보겠습니다. 

int digitDegree(int n) {
    int result = 1;     
    int test = sum(t(n));  
    System.out.println("first>>>"+test); 
    if(n/10 == 0){
        return 0;
    }
    while(true){
            if(Integer.toString(test).matches("[0-9]")){
                System.out.println("finally>>"+test); 
                return result;             
            }            
            else{
                test = sum(t(test));
                System.out.println("retest >>>"+test);
                result ++; 
            }
    }
}
static int sum(Integer[] x){
        int z = Stream.of(x).reduce(0, (a,b) -> {return a+b;});
    return z; 
}
static Integer[] t(int x){
    int [] num = Stream.of(String.valueOf(x).split("")).mapToInt(Integer::valueOf).toArray();
    Integer [] digits = Arrays.stream(num).boxed().toArray(Integer[]::new);
    return digits;
}

뭔가 조잡하지만,, 해결을 하였습니다. 메서드를 따로 구성해서 구해보는것으로 했는데요. 

일단  보시죠.. 

static Integer[] t(int x){
    int [] num = Stream.of(String.valueOf(x).split("")).mapToInt(Integer::valueOf).toArray();
    Integer [] digits = Arrays.stream(num).boxed().toArray(Integer[]::new);
    return digits;
}

주어진 숫자를 배열로 만들어주는 메서드를 만들었습니다. 스트림을 통해 ","로 구분하여 배열로 만들어주고 그것을 리턴하게 만든뒤,, 합을 만들어주는 메서드를 불러옵니다.

 

static int sum(Integer[] x){
        int z = Stream.of(x).reduce(0, (a,b) -> {return a+b;});
    return z; 
}

각 숫자들의 자릿수 수들을 합해주는 메서드를 만들었습니다. 

stream 을 통해서 reduce라는 감소연산을 적용하여, 배열의 원소들을 하나로 합쳐줍니다.

참고 사이트. 

 

JAVA 8 스트림 튜토리얼

출처: Java 8 Stream Tutorial 이 예제-주도 튜토리얼은 Java 8 스트림에 대한 상세한 개요를 제공한다. 맨 처음 Stream API에 대해서 읽을 때, 난 JAVA I/O의 InputStream과 OutputStream과 비슷하게 들리는 이름 때문에 헷갈려했다. 하지만 Java 8 스트림은 완전 다른 것이다. 스트림은 Monads…

wraithkim.wordpress.com

int test = sum(t(n)); // 주어진 값을 한자리씩 다 더해서  
    System.out.println("first>>>"+test); 

이렇게 처음 input 값인 n 을 입력되면, test안에, 각 자릿수 수들의 합이 주워집니다. 

 

이렇게 한뒤, 조건문과 while문을 통해 확인해주는 작업을 실시합니다. 

if(n/10 == 0){return 0;}

이 조건문을 통해 이미 1자릿수의 숫자들은 리턴값을 0으로 설정해줍니다. 

 

그리고 나서, 

 while(true){
            if(Integer.toString(test).matches("[0-9]")){
                System.out.println("finally>>"+test); 
                return result;             
            }            
            else{
                test = sum(t(test));
                System.out.println("retest >>>"+test);
                result ++; 
            }
    }

while문을 통해, if조건문에 걸려서 return되도록, 계속 반복해줍니다. 

각 자릿수의 합인 test값을 가져와서, matches를 통해, 1자릿수인지 확인해줍니다. 

 

만약 1자릿수라면, 그 때의  result값을 리턴, 

그렇지 않다면, 

test를 다시 sum(), t() 메서드에 넣어서 각 자릿수의 합을 다시 구해준뒤,, result는 +1을 해줍니다. 횟수를 카운트 하는 것이죠. 

 

그리고나서, 다시 if문의 matches에 넣어보고,, 되면, 리턴, 안되면 다시 자릿수 합 구하고 카운트.. 이런 형식입니다. 

 

아마 제 기억으로는 이 모든 반복되는 작업을 한곳에서 하기 힘들어서 메서드를 구성해서 간단하게 분리한 것으로 보입니다. 하다하다 안되서;; 방법을 못찾으니 메서드를 하나 만드는게 났다 싶었습니다. 

 

지금 보니, 더 간단하고 변형도 쉽고, 다른 형식으로 코드를 바꿀수도 있어서 더 좋은거 같습니다. 

이것으로 설명을 마치고 다른 분들의 코드를 보겠습니당. 


이제 엘리트 분들의 답안을 감상하자... 

JAVA

  int digitDegree(int n) {
        if(n/10==0)
            return 0;
        int num =0;
        while (n!=0){
            num+=n%10;
            n/=10;
        }
        return 1 + digitDegree(num);
    }

먼저 이분은 더 간단하네요.. 제가 복잡하게 했더군요.. 

return부분의 해당 메서드를 다시 넣어서 리턴하는 이 방법... 저는 어렵더군요 오히려;; 

일단 num은 =0으로 설정하고, num안에, input n 을 10으로 나눈 나머지를 계속 넣어줍니다. 

그리고, n은 10으로 나눠서 각 자릿수로 바꿔주고요. 

이렇게 해서 최종적으로 n = 0이 되면, while문을 빠져나오고, num은 리턴에서 또 difitDegree를 반복하고 +1을 해줍니다. 

91을 예로 들면, 

처음 num =  91%10 = 1 이 들어가고, n= 91/10 = 9 가 됩니다. 

그리고, n !=0이므로, 다시 반복, 

num = 1+ 9%10 = 1+9 = 10 이 되고, n = 9/10 = 0 이 됩니다. while문을 나옵니다. 

그러면 결국 num = 10이 되고, 다시 반복, 

num = 10 % 10 = 0, n = 10/10 = 1이 됩니다. 

이렇게 되면, 바로 0으로 리턴이 되면서 +1을 해주어 1을 최종적으로 리턴하게 됩니다.

정확한지 모르겠지만.. 아무튼 저도 열심히 해야겠어요. ㅠㅠㅠ 어렵네요. 좀 쉽게 좀 해주지.. 그냥 간단하게 하려고 하는코드가 오히려 가독성을 떨어트리는듯한...(내 수준이 안되는건가...?)

 

Python3

def digitDegree(n):
    d=0
    while n>=10:
        n=sum([int(i) for i in str(n)])
        d+=1
    return d

파이썬도 마찬가지.. 배열로 만들고, sum을 구성하여, 리턴횟수를 카운트해서 리턴해준다...? 이런느낌.

 

 

JS

function digitDegree(n) {
    c = 0
    while (n.toString().length>1) {
        n = n.toString().split("").reduce((x,y)=>Number(x)+Number(y))
        c++}
    return c}

자바스크립트는 저랑 비슷한 reduce연산을 사용하였네요... 뭔가 비슷?? 

 

 

공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!

부탁드려요 돈드는거 아니잖아요~

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm > Java' 카테고리의 다른 글

#42_Code Signal Arcade >> Bishop And Pawn  (0) 2020.03.09
#40_Code Signal Arcade >> Longest Digits Prefix  (0) 2020.03.07
#39_Code Signal Arcade >> Knapsack Light  (0) 2020.03.06
    'Algorithm/Java' 카테고리의 다른 글
    • #43_Code Signal Arcade >> Is Beautiful String
    • #42_Code Signal Arcade >> Bishop And Pawn
    • #40_Code Signal Arcade >> Longest Digits Prefix
    • #39_Code Signal Arcade >> Knapsack Light
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바