[Leetcode] 66. Plus One
Identifying the Problem
주어진 수열을 10진수라고 생각하고 +1한 값을 수열로 리턴한다.
Ex) [9,9] -> [1,0,0]
Constraints:
- 1 <= digits.length <= 100
- 0 <= digits[i] <= 9
Organizing thoughts
1. 수열의 끝 부분을 +1 한다.
1-1 그대로 끝나거나
1-2 Ex) 처럼 자리수가 바뀌는 경우가 있다.
자리 수가 바뀐다 = 앞 자리가 9이다. 이므로
2. 앞자리가 9가 아니라면 더한 값을 리턴한다.
3. 앞자리가 9인 경우가 본게임이다.
999 같은 경우를 생각해보면
9 9 10 이 되고
9 10 0 이 되고
10 0 0 이 되고
결국 1 0 0 0 이 된다.
이 과정에서 유추할 수 있는 것은
값이 10으로 바뀌면 0으로 초기화하고 이전 순서의 값을 +1 시킨다는 것이다.
그렇다면 첫 자리가 10이되면, 자리 수가 바뀌어야 되는데, 수열의 size는 int * 3 만큼 할당 되어있는 상태이다.
digitsize만큼 할당되어 있는 수열을 다시 동적할당 해야하는 건가?
라고 생각해 remalloc 하는 방법을 찾아서 고군분투했지만 더 좋은 방법이 떠올랐다.
4. 처음부터 degitSize + 1 만큼 동적할당을 한 정답 수열을 만들어 놓는 것이다.
4-1 다만 degitSize번 부분은 NULL로 두었다가 자리수가 바뀌면 이 부분을 0으로 채우면 된다.
Sourcecode
int* plusOne(int* digits, int digitsSize, int* returnSize){
int n = digitsSize -1;
int i=0;
int* ret = (int*)malloc(sizeof(int)*(digitsSize+1));
*returnSize = digitsSize;
(*(digits+n))++;
while(i<digitsSize)
{
*(ret+i) = *(digits+i);
i++;
}
*(ret+i) = NULL; //4-1
if(*(ret+n) == 10) //+1 을 한 결과 10이 된 경우
{
for(int i=n;i>0;i--)
{
if(*(ret+i) == 10)
{
*(ret+i) = 0; //0으로 초기화하고
(*(ret+i-1))++; //이전 값을 +1 해준다
}
}
}
if(*(ret) == 10) //자리수가 바뀌는 경우
{
*ret = 1; //맨 앞은 1로 바꾸고
*(ret+digitsSize) = 0; //NULL->0으로 바꾸어준다
(*(returnSize))++; //최종 자리수를 +1 한다.
}
return ret;
}
Mistake
1을 증가시키는 과정에서 (degit+i-1)++ 로만 둬 계속 오류가 발생했다.
(degit+i-1)++ 이거는 포인터 위치를 바꾸는 거고, (*(degit+i-1))++ 이렇게 해야 맞다.
그냥 degit[i-1]++ 이렇게 쓰도록하자.
New things learned
글을 쓰면서 느낀건, 코드가 너무 조잡하고 복잡한 것 같다.
다시 풀어보도록 하겠다.
'Algorithm' 카테고리의 다른 글
[Leetcode] 70. Climbing Stairs (0) | 2021.07.27 |
---|---|
[Leetcode] 67. Add Binary (0) | 2021.07.27 |
[Leetcode] 58. Length of Last Word (0) | 2021.07.26 |
[Leetcode] 53. Maximum Subarray (0) | 2021.07.25 |
[Leetcode] 35. Search Insert Position (0) | 2021.07.25 |