LeetCode) 66. Plus One

·2021년 11월 10일
0

Leet_code(Easy)

목록 보기
15/20

배열의 마지막 인덱스에 존재하는 수에 +1을 하는 문제.

Language: java

시도한 첫 코드

class Solution {
    public int[] plusOne(int[] digits) {
        digits[digits.length - 1] += 1;
        int lastOne = digits[digits.length-1];
        
        if(lastOne == 0) {  //올림이 되는 숫자
            if(digits.length > 1) {     //length >= 2
                digits[digits.length - 2] += 1;
                return digits;
            }    
            else if(digits.length == 1) {    //length == 2
                int[] newDigits = {1, 0};
                return newDigits;
            }
        } else {    //올림이 안 되는 숫자
            return digits;
        }
        return digits;   
    }
}

처음엔 마지막 인덱스가 0이 되면, 앞 자리수가 바뀌는 것이라고 판단하여 짠 코드.
그래서 만약 0이고, 원래 길이도 1이었다면 {1,0}을 리턴해주는 아주 무식한 방법을 썼다.
그치만... 세상엔 99도 +1을 하면 0이 되고, 79도 37도 19도 ... 이런 것들을 간과하여 맞은 Wrong Answer.

다음에 짠 두 번째 코드



class Solution {
    public int[] plusOne(int[] digits) {
        if(digits.length == 1 && digits[0] == 0) {
            digits[0] = 1;
            return digits;
        }
        int newInt = 0;
        
        for(int i = 0; i < digits.length; i++) {
            
            newInt *= 10;
            newInt += digits[i];
            System.out.println(newInt); 
        }
        int newIntLength = (int)( Math.log10(newInt)+1 );
        
        newInt += 1;
        
        
        
        if(newIntLength != (int)( Math.log10(newInt)+1 ) ) newIntLength += 1;
        
        int[] newDigits = new int[newIntLength];
        
        for(int i = newDigits.length - 1; i > -1; i--) {
            newDigits[i] = newInt % 10;
            if(newInt > 9) newInt /= 10;
        }
        
        return newDigits;
    }
}

어딘가에서 뭘 보고 Math.log10이니 뭐니를 써서 run까지는 success했으나 ... 뭔가 잘못됐다.

분명 코드대로라면 Expected처럼 나와야하는 데...
왜냐하면 sysout으로 찍어본 결과는 맞았기 때문이란 말이다.
아무래도 정수의 최대 값을 넘어서 찍어버린 게 아닌가? 하는 터무니없는 생각도 해보았다.
그래서 결국 또 구글링을 시도해버렸다.

다른 사람들의 코드를 참고한 최종 코드

class Solution {
    public int[] plusOne(int[] digits) {
        digits[digits.length - 1] += 1;
        int lastOne = digits[digits.length-1];
        
        if(lastOne < 10) return digits;
        
        //올림 수일 경우 계속 확인해주면서 올림
        for(int i = digits.length-1; i > 0; i--) {
            if(digits[i] > 9) {
                carry(i, digits);
            }
        }
        
        //젤 첫 요소가 10일 때
        if(digits[0] > 9) {
            int[] newDigits = new int[digits.length + 1];
            newDigits[0] = 1;
            for(int i = 1; i < newDigits.length; i++) {
                newDigits[i] = 0;
            }
            return newDigits;
        }
        
        return digits;
    }
    
    public void carry(int index, int[] digits) {
        digits[index] = 0;
        digits[index - 1] += 1;
    }
}

배운 것 두 가지.
1. 역시 써보면서 그려보면서 코드 스토리를 짜라
2. 코드가 길어질 거 같을 때나, 기능을 짜고 싶을 땐 메소드를 만들어보자

정말 난 아직도 우물 안 개구리구나 ...

profile
HAPPY !

0개의 댓글