[Leetcode] 67. Add Binary
Algorithm2021. 7. 27. 22:45
반응형
Identifying the Problem
두 이진수 문자열을 더해 이진수 문자열을 return 한다.
Organizing thoughts
1. 일단 a 가 긴지, b가 긴지 몰라서 a를 긴 문자열로 정했다.
2. 자리수가 증가할 수 있으므로 a의 길이 + null 문자열 + 1 만큼 동적할당하였다.
3. a와 b의 상태를 파악하고 둘 더한 값을 stack 에 채워 넣는다.
3-1 stack은 채워지는 값을 뜻 하고, flag는 넘기는 수를 뜻 한다.
a b 합이 1인 경우 flag을 올려 더 큰 자리수에 1을 넘겨 준다.
4. 이거를 표로 정리하면 다음과 같다.
a | b | flag | sum |
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
0 | 1 | 1 | 2 |
1 | 0 | 1 | 2 |
1 | 1 | 0 | 2 |
1 | 1 | 1 | 3 |
5. sum 이 2이면 flag를 세우고, stack에 0을 채운다.
sum 이 3이면 flag를 세우고, stack에 1을 채운다.
0과 1 인경우는 stack에 0또는 1을 채운다.
6. sum는 매 시도마다 초기화 한다.
7. 만들어진 stack을 뒤집는다. (이유는 가장 작은 자리수가 가장 큰 자리수가 되었기 때문이다)
Sourcecode
#include <string.h>
#include <stdlib.h>
char * addBinary(char * a, char * b){
int a_l = strlen(a);
int b_l = strlen(b);
char * c;
int flag = 0;
int sum = 0;
if(b_l>a_l) //1
{
c = a;
a = b;
b = c;
a_l = strlen(a);
b_l = strlen(b);
}
char* stack = malloc(sizeof(char) * a_l + 2) ; //2
*stack = 0;
for(int i=0; i<a_l; i++)
{
if(a[a_l-1- i] == '1') sum += 1; //3
if (flag ==1) sum += 1;
if(i<b_l)
if(b[b_l-1- i]=='1') sum += 1;
if(sum == 0) //5
{ strcat(stack,"0"); flag = 0;}
else if(sum == 1)
{ strcat(stack,"1"); flag = 0;}
else if(sum == 2)
{ strcat(stack,"0"); flag = 1;}
else if(sum == 3 )
{ strcat(stack,"1"); flag = 1;}
sum = 0; //6
}
if(flag == 1)
strcat(stack,"1");
int len = strlen(stack) - 1;
char tmp;
for(int i=0;i<=len/2;i++)
{
tmp = *(stack+len-i);
*(stack+len-i) = *(stack+i);
*(stack+i) = tmp;
}
return stack;
}
반응형
'Algorithm' 카테고리의 다른 글
[Leetcode] 268. Missing Number (0) | 2021.07.27 |
---|---|
[Leetcode] 70. Climbing Stairs (0) | 2021.07.27 |
[Leetcode] 66. Plus One (0) | 2021.07.26 |
[Leetcode] 58. Length of Last Word (0) | 2021.07.26 |
[Leetcode] 53. Maximum Subarray (0) | 2021.07.25 |
댓글()