240802 TIL - 자동으로 JAVA 코드에 눈이 가는...

LIHA·2024년 8월 2일
0

내일배움캠프

목록 보기
10/108
post-thumbnail
post-custom-banner

SQL

알고리즘

숫자 한번 다시 배열하기 어렵네!

function solution(n) {
    var answer = 0;
    let leng = n.toString();
    let i = 0;
    let tmp = 0;

    for (i = 0; i < leng - 1 ; i++) {
        if (Number(leng[i]) > Number(leng[i+1])) {
            tmp = leng[i+1];
            leng[i+1] = leng[i];
            leng[i] = tmp;
            
            console.log (n + ' : n값')
            console.log (leng[i] + ' : leng[i]값')
            console.log (leng + ' : leng값')
        }
        answer = leng;
    }
    
    return answer;
}
  • 일단 이런 식으로 구해보고 있는데 leng의 값이 바뀌어 들어가지 않는다! 왜일까?
    -> leng이 숫자덩어리의 String배열이라 개개의 값으로 나눠지는게 아니고 요소 한개라서 바뀌지 않는 것이었다!
    -> 숫자덩어리여도 .toString() 으로 변환했을 때 인덱스별로 한 글자씩 낱개로 취급해준다!

방법1. slice를 써볼까?

이건 실패! 여기에 쓰는 방법이 아니다

방법2. 자릿수 구하기 방식으로 요소 하나하나 배열화 -> 숫자로 변경

시도중인데 쉽지 않다. 일단 숫자 낱개 배열로 나오고, 숫자의 순서가 이상하다. 827311이 나온다.

function solution(n) {
    var answer = 0;
    let leng = n.toString();
    let i = 0;
    let tmp = 0;
    let arr = [];
    let quote = 0;
    
    for (i = leng.length-1 ; i >= 0 ; i--) {
        quote = n / (10 ** i);
        n = n % (10 ** i);
        arr[i] = Math.floor(quote);
        
        if(arr[i] < arr[i+1]) {
            tmp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = tmp;
            
        }
        console.log(arr)
    }
    
    return answer;
}

너무 JAVA스러운 방법을 쓰고 있었나보다! 튜터님의 조언

  • 이런 경우는 대부분 arr.sort()를 쓴다.
  • split이나 join같은걸 써서 배열을 뜯거나 붙여보자.
  • join을 쓰면 하나의 배열로 붙여버릴 수 있다.
function solution(n) {
    var answer = 0;
    let str = n.toString();
    let arr = [];
    let i = 0;
    
    for (i = 0; i < str.length ; i++) 
    {  arr[i] = str[i]
     
       arr.sort(function(a, b) { //내림차순 배열
        if (a < b) return 1;
        if (a == b) return 0;
        if (a > b) return -1;
    });
    }
    answer = Number(arr.join(''));
    return answer;
}

이젠 어렵지 않아 하샤드 수 😎

function solution(x) {
    var answer = true;
    let str = x.toString();
    let i = 0;
    let quote = 0;
    let sum = 0;
    
    for (i = str.length - 1 ; i >= 0 ; i--) {
        quote = Math.floor(x / (10 ** i));
        x %= (10 ** i);
        sum += quote;
    }

      if (Number(str) % sum == 0) {
          // 이때 x % sum == 0 으로 쓸 경우 모두 true가 된다 - 위에서 x %= (10 ** i)를 써서 x값이 변했기 때문
          // 그래서 처음 x값을 가지고 있는 스트링인 str에서 숫자를 뽑는 식으로 처음 수를 추출
        answer = true 
    } else 
        answer = false;
    
    return answer;
}

다른 답은 없을까? '숫자 사이의 합'

정답은 이렇게 써서 냈지만, 뭔가 다른 형태는 없는지 고민이 되었다. 엑셀처럼 삼항연산자 중첩은 안되나?🤔

  • 이 문제의 다른 풀이는 등차수열의 합공식처럼 푸는 것이 있었다.
    해당 풀이에 달린 '가우스의 재림'이라는 프로그래머스 코멘트가 재밌었다 ㅋㅋ
function solution(a, b) {
    var answer = 0;
    let i = 0;
    let sum = 0;

        if( a > b )  {
            for (i = b; i <= a ; i++) { sum += i; }
            answer = sum;
            return answer;
        }
        else if ( a < b ) {
            for (i = a; i <= b; i++) { sum += i; }
            answer = sum;
            return answer;
        }
    
        else (a == b) 
            answer = a;
            return answer;
        

    return answer;
}

절대값 > 0 인 케이스로 묶어버릴 순 없나?

내 코드는 왜인지 작동을 하지 않았다. Math.abs에 성공하고 싶다!

삼항연산자를 써보고 싶은데... -> 으하하하 대실패

삼항연산자의 중첩을 이래저래 찾아봤지만 참거짓 형태가 아니면 안되나보다!
구글링을 해봐도 삼항연산자 내에 for문을 넣는 형태는 없었다. 으하하하 몰루몰루


function solution(a, b) {
    var answer = 0;
    let i = 0;
    let sum = 0;

answer = (a < b) ? (a > b) ? {for(i = a ; i < b ; i++) { answer += i; return answer} : for (i = b; i < a; i++) {answer += i; return answer } : a;
        
return answer;

}

왜 안되지? 틀린것 투성이 폴라츠 추측

무엇이 틀렸는지 짚어보도록 하자. 이것은 틀린코드!

function solution(num) {
    var answer = 0;
    let i = 0;
    
    for (i = 0; i <= 500 ; i++ ) { 
      //여기서의 i는 인덱스가 아니라 횟수로 쓸거였으니 1부터 했어야 한다
        if (num == 1) {
            break;
            answer = i;
            return answer;
        } 
      // 위의 if문 대체 어디에 어떻게 써야할지 모르겠어서 항해때 쓴 JAVA 코드를 참고했다..ㅎ..
        
        if (num % 2 == 0) {
        num /= 2;
        } else if (num % 2 != 0) {
        num *= 3 + 1;
          // 이렇게 쓰면 식이 num = (num * 3) + 1 이 아니라 * 4로 인식한다!
          //하도 이상해서 console.log 찍어봤더니 num이 12가 찍히는걸 보고 깨달았다...
        }
        answer = i;
    }
    
         if (i > 500) {
            answer = -1
        } 
    return answer;
}

이것은 정답코드!

function solution(num) {
    var answer = 0;
    let i = 0;
    
    for (i = 1; i <= 500 ; i++ ) {        
        if (num == 1) {
            break;
            answer = i;
            return answer;
        } 
        
        if (num % 2 == 0) {
        num /= 2;
        } else {
        num = num*3 + 1;
        }
        answer = i;
    }
    
         if (i > 500) {
            answer = -1
        } 
    return answer;
}
profile
갑자기 왜 춤춰?
post-custom-banner

0개의 댓글