배열의 마지막 인덱스에 존재하는 수에 +1을 하는 문제.
시도한 첫 코드
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. 코드가 길어질 거 같을 때나, 기능을 짜고 싶을 땐 메소드를 만들어보자
정말 난 아직도 우물 안 개구리구나 ...