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라는 감소연산을 적용하여, 배열의 원소들을 하나로 합쳐줍니다.
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연산을 사용하였네요... 뭔가 비슷??
공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'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 |