ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1110번 더하기 사이클
    알고리즘 2022. 5. 23. 21:54

    출처 링크:

    https://www.acmicpc.net/problem/1110

     

    나만의 풀이법

    // 입력값
    const n = 26
    
    let num = n
    let result = 0
    let cycle = 0
    
    while (true) {
    
      // 10 보다 작은 경우 앞 자리에 0 붙여서 연산하기
      if (num < 10) {
    
        // result = 0 + num 이므로 아래와 같이 식을 써주어도 상관없다.
    
        num = Number(`${num}` + `${num}`)
        
    } else {
    
        result = `${num}`[0]/1 + `${num}`[1]/1
        num = Number(`${num}`[1] + `${result}`.split('').pop())
        // 이처럼 result를 문자열로 바꾼 후 split하면 result가 한 자리 수이든 두 자리 수이든 상관없이
        // 숫자 하나씩 배열에 담기게 된다. 그 배열에서 스택의 pop을 이용해 가장 끝에 있는 수를 가져올 수 있다.
        // 이렇게 하면 result가 한 자리 수여도 그 숫자가 나오게 되어 간편하다.
    
    }
      cycle++
      // 사이클을 다 돌았다면 반복문 빠져나오기
      if (num === n) {
        break;
      }
    }
    
    console.log(cycle)

     

    백준 제출 코드

     

    const n = require('fs').readFileSync('dev/stdin').toString().trim()/1
    
    let num = n
    let result = 0
    let cycle = 0
    
    while (true) {
    
      if (num < 10) {
        num = Number(`${num}` + `${num}`)
        
    } else {
        result = `${num}`[0]/1 + `${num}`[1]/1
        num = Number(`${num}`[1] + `${result}`.split('').pop())
    }
      cycle++
      if (num === n) {
        break;
      }
    }
    
    console.log(cycle)

    이렇게 하니 통과되었다.

    split()의 경우 문자열의 길이가 N일때 문자열을 다 돌아야 하니 시간 복잡도가 O(N)일텐데 이 문제에선

    0 <= N <= 99 이므로 애초에 문자열의 길이가 최대 2밖에 되지 않아 연산이 오래 걸리진 않을 것이라 생각했다.

     

    하지만 전에 제출한 모범 답안을 보니 더욱 간편한 방법이 있었다.

     

    let input = Number(require('fs').readFileSync('/dev/stdin').toString());
    
    let num = input;
    let sum;
    let i = 0;
    
    while (true) {
        i++;
    
        sum = Math.floor(num / 10) + num % 10;
        num = (num % 10) * 10 + sum % 10; 
    
        if (input === num) {
    	break;
        } 
    }
    
    console.log(i);

     

    나의 풀이와 근본적인 원리 자체는 똑같은 것 같지만

    이 코드의 경우 십의 자리와 일의 자리를 더하는 것을 복잡한 기능을 쓰지 않고 구현하였다.

    그저 Math함수와 간단한 사칙연산 정도만 안다면 구현할 수 있는 코드이다.

    나의 풀이와 달리 n이 10보다 작은지 큰지와 상관이 없기에 if문을 하나 덜 써도 된다는 것은

    매우 큰 차이라고 생각한다.

     

    모든 문제를 어렵게 생각할 필요가 없으며 세상엔 내가 생각한 것 보다 간략하고 효율적인 해답도 있다는 것을

    다시금 깨닫는다.

    '알고리즘' 카테고리의 다른 글

    백준 1002번 터렛  (0) 2022.06.02
    백준 1011번 Fly me to the Alpha Centauri  (0) 2022.05.29
    백준 1929번 소수 구하기  (0) 2022.05.14
    백준 10250번 ACM 호텔  (0) 2022.05.09
    백준 2869번 달팽이는 올라가고 싶다.  (0) 2022.05.09
Designed by Tistory.