Leetcode 66. Plus One / Easy / 자바스크립트 문제 풀이
문제 설명
정수 배열 자릿수로 표현되는 큰 정수가 주어집니다.
여기서 각 자릿수[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을 통해서 숫자로 바꿔주기만하면 문제는 끝이 난다.