본문 바로가기
Algorithm/LeetCode

[Java] 66. Plus One

by tabasco 2023. 6. 8.

문제 설명 : 

- 1자리의 숫자들이 담겨있는 int array digits이 존재한다. 이 array에서 각 숫자들의 위치가 곧 자리수가 되어 10진수처럼 생각해보자.

- 마지막 1의 자리 숫자에 1을 더한 결과가 되는 10진수를 다시 int array에 자리수에 맞춰 할당하여 return한다.

class Solution {
    public int[] plusOne(int[] digits) {
        //digits의 숫자를 하나씩 뽑아 자리수에 배정하고, 마지막에 +1을 더한 값을 다시 배열로 할당
        //digits의 각 자리 합이 int의 범위를 넘을 수 있음.

        StringBuffer buffer = new StringBuffer("");
        boolean check = true;
        int[] dummy = new int[digits.length+1];

        dummy[0] = 0;

        for(int i=0; i<digits.length; i++){
            dummy[i+1] = digits[i];
        }

        for(int i=dummy.length-1; i>=0; i--){
            if(check){
                int lastNum = dummy[i] + 1;
                if(lastNum == 10){
                    buffer.insert(0, "0");
                }else{
                    check = false;
                    buffer.insert(0, dummy[i]+1);    
                }
            }else{
                buffer.insert(0, dummy[i]);
            }
        }

        String resultStr = buffer.toString();

        if(resultStr.charAt(0) == '0'){
            resultStr = resultStr.substring(1);
        }

        int[] result = new int[resultStr.length()];

        for(int i=0; i<resultStr.length(); i++){
            result[i] = Integer.parseInt(resultStr.charAt(i) + "");
        }

        return result;
        
    }
}

 

해설 :

- LeetCode를 보면, 좀 더러운 문제들은 확실히 unlike가 많습니다. 이 문제는 like 7.5k, unlike 5k로 굉장히 지저분한 문제에 속하는 것 같습니다.

- 이 문제가 안좋은 이유는 조건에 대한 설명이 매우 부족합니다. 처음에는 단순히 array의 값들에 자리수를 부여하여 int로 변환해 1을 더해주고, 그 결과를 다시 새로운 array에 담아주려 했는데 결과가 int자리 수보다 큰 값이 들어있을 수 있었습니다.

- 그래서 long으로 변경하여 풀었는데, long의 범위도 초과하는 케이스가 있었습니다.

- BigInteger를 활용할까 하다가 그러면 어차피 String으로 풀이하는 것과 큰 차이가 없을 것 같아서 마지막 자리수에 1을 더했을 때, 자리수 올림이 생기는지를 확인하고, 그 이후에도 1을 더해나가며 자리수 올림이 발생하는지 확인하는 방식으로 해결했습니다.

- 이렇게 되면 9999999...99999999 와 같은 Origin value가 존재할 때 100000....000000과 같은 결과가 나오게 될텐데, 그렇게되면 array 자체의 사이즈가 1자리 커져야할 수 있어서 미리 Origin 보다 1자리 수 큰 array를 만들고 index 0에 0의 값을 넣어주었습니다.

- 마지막에 index 0의 값이 여전히 0이라면 이를 제외한 뒤, 다시 int배열에 담아주어 return했습니다.

'Algorithm > LeetCode' 카테고리의 다른 글

[Java] 69. Sqrt(x)  (0) 2023.06.09
[Java] 67. Add Binary  (0) 2023.06.08
[Java] 58. Length of Last Word  (3) 2023.06.08
[Java] 35. Search Insert Position  (0) 2023.06.08
[Java] 28. Find the Index of the First Occurrence in a String  (0) 2023.06.08