코드노트

Leetcode 66. Plus One / Easy / 자바스크립트 문제 풀이 본문

Code note/자바스크립트 알고리즘 문제풀이

Leetcode 66. Plus One / Easy / 자바스크립트 문제 풀이

코드노트 2022. 10. 13. 19:55

문제 설명

더보기

정수 배열 자릿수로 표현되는 큰 정수가 주어집니다.

여기서 각 자릿수[i]는 정수의 i번째 자릿수입니다.

숫자는 왼쪽에서 오른쪽 순서로 최상위에서 최하위 순으로 정렬됩니다.

큰 정수에는 선행 0이 포함되지 않습니다.

큰 정수를 1씩 증가시키고 결과 배열을 반환합니다.

- 간단하게 말하면 배열로 들어오는 수에 1을 더한값에 1을 더해서 배열로 반환하면 되는 문제

ex ) [ 9, 9 ] 가 들어오면 99에 1을 더해서 [ 1, 0, 0 ] 을 반환하면 된다.

 

- 처음에 접근할때는 간단하게 생각했다.

- 들어오는 배열의 길이는 최대 100이다. 그렇기 때문에 자바스크립트에서 최대정수 범위를 생각해야한다.

* 9007199254740991 ~ -9007199254740991

 

- split, sort, join을 통해서 풀려고 했지만 정수범위가 초과되게 되는 test에서는 실패하였다.

 

문제 풀이

let plusOne = function (digits) {
  for (let i = digits.length - 1; i >= 0; i--) {
    digits[i]++;
    if (digits[i] > 9) {
      digits[i] = 0;
    } else {
      return digits;
    }
  }
  digits.unshift(1);
  return digits;
};

만약 [ 9 ] 가 들어오게 되면!

- for를 통해서 i를 현재 들어오는 배열에서 마지막 요소를 넣어준다.

- i는 0보다 크거나 같은지 확인한다. i를 끝 index부터 첫 index까지 for문을 돌아준다.

- 그리고 배열의 요소[ i ]에 ++시킨다.

- 만약 요소가 9보다 크면? / 10이 되었기 때문에 0을 할당 한다. 

그리고 for문이 끝나면 unshift를 통해서 1을 넣어주면 [ 1, 0 ] 이 완성된다.

 

이렇게 문제코드를 작성하면 9를 만났을 때 for문을 돌면서 0으로 바꾸고 그 앞자리에는 ++이 되면서 증가시킨다 그리고 9가 아니면 바로 return이 되기 때문에 한자리수가 아닌 이상 unshift는 실행되지 않는다. 간단하게 뒤의 index들을 확인하고 9인지 아닌지 여부를 통해서 간단하게 풀 수 있는 문제다.

 


다른 풀이

var plusOne = function (digits) {
    return (BigInt(digits.join("")) + BigInt(1)).toString().split("").map((v) => Number(v))
};

- 어떻게 보면 이 문제에 핵심은 큰 수가 들어왔을 때의 문제가 생긴다.

- 그 문제를 Bigint를 통해서 해결했다.

- 배열이 들어오면 join을 통해서 정수로 만들어준다.

- 그리고 그 수에 Bigint(1)을 더해주고 문자열로 변경해준다. split을 사용하기 위해서 변경!

- 그후 map을 통해서 숫자로 바꿔주기만하면 문제는 끝이 난다.