[Easy] 989. Add to Array-Form of Integer

문제

The array-form of an integer num is an array representing its digits in left to right order.

  • For example, for num = 1321, the array form is [1,3,2,1].

Given num, the array-form of an integer, and an integer k, return the array-form of the integer num + k.

 

정수 번호의 배열 형식은 왼쪽에서 오른쪽 순서로 숫자를 나타내는 배열이다.

예를 들어, num = 1321의 경우 배열 형식은 [1,3,2,1]입니다.
주어진 num, 정수의 배열 형식 및 정수 k가 주어지면 정수 num + k의 배열 형식을 반환한다.

 

예시

Example 1:

Input: num = [1,2,0,0], k = 34
Output: [1,2,3,4]
Explanation: 1200 + 34 = 1234

Example 2:

Input: num = [2,7,4], k = 181
Output: [4,5,5]
Explanation: 274 + 181 = 455

Example 3:

Input: num = [2,1,5], k = 806
Output: [1,0,2,1]
Explanation: 215 + 806 = 1021

 

제약 조건

Constraints:

  • 1 <= num.length <= 104
  • 0 <= num[i] <= 9
  • num does not contain any leading zeros except for the zero itself.
  • 1 <= k <= 104

 

해결 과정 

  • BigInt가 아니라면 num에 k를 더한 값을 배열로 반환한다.
  • 만약 BigInt라면 그 이후의 연산을 계산한다.
  • num[0] === 0이라면 k를 배열로 반환한다.
  • num과 k 중 더 긴 길이를 len 배열에 저장한다.
  • result 배열을 생성한다. 이때 길이는 len + 1, 값은 0으로 채워준다.
  • num의 길이가 0이 될 때까지 while문을 돈다.
    • num에서 pop한 값을 n1, k % 10한 값을 n2로 지정한다.
    • 두 값을 더한 값을 res에 저장한다.
    • k는 k / 10한 값을 정수로 넣어준다. 
    • 만약 res가 9보다 크다면 그 다음 자릿수의 값을 증가한다.
    • res에는 1의 자릿수만 남긴다.
    • 만약 res와 현재 자릿수의 값을 더했을 때 9보다 크다면 (이 경우에는 10인 경우밖에 없다.) 현재 위치의 요소를 0으로 지정하고 그 다음 자릿수의 값을 하나 증가한다. 
    • res와 현재 자릿수의 값을 더했을 때 9 이하라면 현재 자릿수에 res를 더해준다. 연산이 끝나면 len 배열의 값을 하나 감소하여 그 다음 자릿수의 연산을 진행한다.
  • while문이 끝나면 num에 대한 계산은 끝난 것이다. 하지만 k의 값이 아직 남아있는 경우가 있다. 
  • k가 0보다 크다면 (아직 연산된 값이 남아있다면) 아래의 연산을 수행한다.
    • result의 마지막 0 인덱스를 찾아 i에 넣는다.
    • k의 자릿수 숫자마다 result 값에 넣어준다.
  • 만약 result의 첫번째 인덱스가 0이라면 shift()를 한다.
  • 완성된 result를 반환한다.

이 문제를 푸느라 4시간 이상이 걸렸다...🤯

처음에 코드를 잘못 짰는지 계속 IDE로 디버깅을 해보며 예외 처리를 시켜주었다.

결국 내가 선택한 방법은 BigInt와 그렇지 않은 숫자로 크게 경우를 2가지로 나누어 BigInt가 아닌 경우에는 심플하게 문제를 해결하고, BigInt인 경우에 아래 연산을 진행하도록 하였다. 

숫자의 연산을 직접 계산하는 것은 쉬워 보이지만 생각할 TC가 많아 까다로운 것 같다.

 

해결 코드

/**
 * @param {number[]} num
 * @param {number} k
 * @return {number[]}
 */
var addToArrayForm = function(num, k) {      
  if(214748364 > parseInt(num.join("")) + k){
    return (parseInt(num.join("")) + k).toString().split('')
  }
    
if (num[0] === 0) return k.toString().split('');
    
  let len = num.length > k.toString().length ? num.length : k.toString().length;

  let result = new Array(len + 1).fill(0);

  while (num.length) {
    let n1 = num.pop();
    let n2 = k % 10;
    let res = n1 + n2;

    k = parseInt(k / 10);

    if (res > 9) {
      result[len - 1]++;
      res %= 10;
    }
      
    let temp = result[len] + res;
    if (temp > 9) {
      result[len--] = 0;
      result[len]++;
    } else {
      result[len--] += res;
    }
    
  }
    
    if (k > 0) {
    let i = result.lastIndexOf(0);
    while (k > 0) {
      if (k % 10 !== 0) {
        result[i--] = k % 10;
      }

      k = parseInt(k / 10);
    }
  }

  if (result[0] === 0) result.shift();
  return result;
};

'leetCode' 카테고리의 다른 글

[Medium] 739. Daily Temperatures  (0) 2022.06.17
[Easy] 67. Add Binary  (0) 2022.06.15
[Medium] 1367. Linked List in Binary Tree  (0) 2022.06.15
[Medium] 43. Multiply Strings  (0) 2022.06.15
[Easy] 150. Evaluate Reverse Polish Notation  (3) 2022.06.13