본문 바로가기

LeetCode

[LeetCode] - 66. Plus One

LeetCode는 프로그래밍 문제를 풀며 코딩 실력을 향상할 수 있는 온라인 플랫폼입니다. 다양한 알고리즘 및 데이터 구조 문제를 제공하며, 면접 대비에 유용합니다. 해당 문제는, LeetCode Problems에서 볼 수 있는 난이도 '쉬움 (Easy)' 단계인 "Plus One" 문제입니다.

--> https://leetcode.com/problems/plus-one/description/

 

문제 : 

You are given a large integer represented as an integer array digits, where each digits[i] is the ith digit of the integer.

The digits are ordered from most significant to least significant in left-to-right order.

The large integer does not contain any leading 0's. Increment the large integer by one and return the resulting array of digits.


Example 1:

Input : digits = [1,2,3]

Output : [1,2,4]

Explanation : The array represents the integer 123. Incrementing by one gives 123 + 1 = 124. Thus, the result should be [1,2,4].

 

Example 2 :

Input : digits = [4,3,2,1]

Output : [4,3,2,2]

Explanation : The array represents the integer 4321. Incrementing by one gives 4321 + 1 = 4322. Thus, the result should be [4,3,2,2].

 

Example 3:

Input : digits = [9]

Output : [1,0]

Explanation : The array represents the integer 9. Incrementing by one gives 9 + 1 = 10. Thus, the result should be [1,0].

 

Constraints :

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9
  • digits does not contain any leading 0's.

이 문제는 정수 배열 digits가 주어지면, 이 배열은 가장 높은 자릿수부터 낮은 자릿수까지 정수를 나타냅니다. 이 정수에 1을 더한 결과를 배열로 반환해야 합니다. 예를 들어, 입력이 [1,2,3]이면 출력은 [1,2,4]입니다. 이렇게만 보면 상당히 쉬운 것 같지만, 진짜 문제점은 자릿수가 9일 때입니다. 예를 들자면, [1,2,9] 이면 출력이 [1,3,0] 이어야 하는데 마냥 낮은 자릿수에다가 +1을 해버리는 코드를 짜면, [1,2,10]이 되어버리는 참사가 일어납니다. 그리하여 제 코드를 보여드리면서 설명드리겠습니다 : 

class Solution {
    public int[] plusOne(int[] digits) {
        int n = digits.length - 1;
        for (int i = n; i >= 0; i--) {
            if (digits[i] < 9) {
                digits[i]++;
                return digits;
            }
            digits[i] = 0;
        }
        int[] newDigits = new int[n + 2];
        newDigits[0] = 1;
        return newDigits;
    }
}

 

제일 먼저 digits의 배열 차원(?)에서의 길이를 n이라고 부릅니다. 매번 digits.length - 1라고 쓰기 번거롭기 때문이죠. n이 digits.length 가 아니라 digits.length - 1인 이유는 자바 배열에서의 인덱스는 0부터 시작하기 때문입니다.

그리고나서는 반복문을 돌릴 텐데, 뒤에서부터 돌립니다, 이유는 가장 낮은 자릿수에다가 1을 더하기 위함입니다.

만약 그 자릿수가 9보다 작으면, 1을 더하고 바로 그 digits를 반환하면 되고, 만약 그게 아니라면 그 자릿수는 0으로 대체합니다. 이게 말로만 하면 어려우니까 예시를 들겠습니다.

 

digits = [1,2,9]라고 가정합시다. 그럼, n = 3 - 1 = 2이고 반복문을 돌립니다. if (digits[i] < 9) 코드를 돌릴 때, 9 < 9가 아니므로, digits[i] = 0으로 넘어갑니다, 그럼 digits = [1,2,0]가 되겠죠. 그러고 다시 반복문으로 도돌이표처럼 다시 똑같이 합니다,

[1,2,0]에서 2는 9보다 작으므로 +1을 합니다, 그럼 digits = [1,3,0]이 되고, 이게 [1,2,9]에다가 +1을 한 값이 맞기 때문에 정답입니다.

 

마지막으로, 마지막 코드줄들을 간단히 설명드리겠습니다. 우리가 마지막으로 다뤄야하는 경우가 있는데요, 바로 모든 자릿수들이 9일 때입니다. 예를 들면 digits = [9,9,9]인 경우죠. 이럴 때에 +1을 해버리면, 자릿수의 개수가 바뀝니다. [1,0,0,0]가 되어야 하죠. 그렇기 때문에, 아예 newDigits라는 배열을 초기화합니다. 그리고 digits의 길이보다 하나 더 큰 배열로 newDigits를 정의하는 겁니다. 자바의 특성상 newDigits는 0으로만 가득 채워진 배열입니다. 그렇기 때문에 newDigits의 제일 높은 자릿수를 1로만 정정하면 패스가 됩니다.


Runtime 결과