본문 바로가기
알고리즘

[LeetCode/JAVA] 66. Plus One

by 상후 2021. 7. 18.
728x90
반응형

https://github.com/ROUTINE-STUDY/Algorithm

 

ROUTINE-STUDY/Algorithm

초보 알고리즘 스터디 / 누구나 참여 가능 :runner:. Contribute to ROUTINE-STUDY/Algorithm development by creating an account on GitHub.

github.com

알고리즘 스터디를 진행하고 있습니다.
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
문의는 댓글 혹은 GitHub 주소를 참고해주세요.

문제 출처 : https://leetcode.com/problems/plus-one/

 

Plus One - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

출처 : LeetCode

문제 설명
음이 아닌 정수를 나타내는 배열이 주어지고, 해당 배열 마지막 요소에 + 1을 증가시킵니다.
Input : [1, 2, 9]
Output : [1, 3, 0] 
풀이 방법
이번에도 마음에 들지 않는 코드이고, 좀 어렵게 생각하여 푼 것 같습니다.
1. 더해야 할 배열의 마지막 인덱스가 9 인지 판단
2. 뒤에서부터 9의 개수가 몇 개인지 카운팅
3. 배열의 요소 모두 9라면 배열의 길이를 증가하여 return (9, 9 이면 1, 0, 0 으로)
4. 3번이 아니라면 카운팅 한 만큼 0으로 변경 및 그 앞자리는 + 1 연산
내 코드(JAVA)

 

public static int[] plusOne(int[] digits) {
    // 끝자리가 9라면 계산 필요
    if(digits[digits.length-1] == 9) {

        // 뒤에서부터 9의 개수 카운팅
        int cnt = 0;
        for(int i=digits.length-1; i>=0; i--) {
            if(digits[i] == 9) cnt++;
            else break;
        }

        // 요소 모두 9라면 배열의 길이 증가 필요, 맨 앞에만 1로 바꿔주고 int[] 기본값은 0
        if(cnt == digits.length) {
            int[] arr = new int[digits.length+1];
            arr[0] = 1;
            return arr;
        } else {    // 모두 9가 아니라면 요소 앞은 +1이 되고 뒷자리는 0으로 변경
            int len = digits.length-1;
            while(cnt >= 0) {
                if(cnt == 0)  {
                    digits[len]++; break;
                }
                digits[len] = 0;
                --len; --cnt;
            }
            return digits;
        }
    } else {
        digits[digits.length-1]++;
        return digits;
    }

}
스터디 피드백 내용
굳이 if문으로 0일 때, 조건을 주기보다는 while문의 조건을 0보다 클 때로 수정하고, if문 내부 코드를 밖으로 빼는 게 낫지 않았을까요.

 

while(cnt > 0) {
    digits[len] = 0;
    --len; --cnt;
}
if(cnt == 0)  {
    digits[len]++;
}

반복문 안의 if문을 제거함으로써 효율성 증가 피드백

 

다른 사람 코드

 

https://leetcode.com/problems/plus-one/discuss/24082/My-Simple-Java-Solution
public int[] plusOne(int[] digits) {
        
    int n = digits.length;
    for(int i=n-1; i>=0; i--) {
        if(digits[i] < 9) {
            digits[i]++;
            return digits;
        }
        
        digits[i] = 0;
    }
    
    int[] newNumber = new int [n+1];
    newNumber[0] = 1;
    
    return newNumber;
}

나의 답에 비해 너무 간단한 풀이를 보고 자괴감을 느꼈던 문제..

배열을 뒤에서부터 반복하는데,

맨 뒤 요소가 9보다 작다면 +1 해서 return, 그렇지 않으면 0으로 변경

이 반복문을 진행하면 모든 요소가 9가 아닌 이상 모두 처리 가능.

 

반복문에서 처리가 안되었다면 모든 요소가 9라는 케이스이고 배열의 길이를 증가하여 맨 앞자리를 1로 저장

int형 배열의 기본값은 0 이기에 다른 작업 필요 X

 

728x90
반응형

댓글