문제 설명 :
- 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 |