본문 바로가기
알고리즘/코딩 테스트 문제

[프로그래머스] 이진수 더하기(C)

by 진진리 2023. 9. 21.
728x90
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

void strrev(char* s) {
  size_t size = strlen(s);
  char temp;

  for (size_t i = 0; i < size / 2; i++) {
    temp = s[i];
    s[i] = s[(size - 1) - i];
    s[(size - 1) - i] = temp;
  }
}

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* bin1, const char* bin2) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    char* answer = (char*)malloc(sizeof(char)*11);
    char* str1 = (char*)malloc(sizeof(char)*11);
    char* str2 = (char*)malloc(sizeof(char)*11);
    int carry = 0;
    int i;
    
    if(strlen(bin1)>strlen(bin2)) {strcpy(str1, bin1); strcpy(str2, bin2);}
    else {strcpy(str1, bin2); strcpy(str2, bin1);}
    
    strrev(str1);
    strrev(str2);
    
    int str1_len = strlen(str1);
    int str2_len = strlen(str2);
    
    for(i=0;i<str2_len;i++){
        if(carry == 0){
            if(str1[i]=='0'&&str2[i]=='0') answer[i] = '0';
            else if(str1[i]=='1'&&str2[i]=='1') {answer[i] = '0'; carry = 1;}
            else answer[i]='1';
        }
        else{
            if(str1[i]=='0'&&str2[i]=='0') {answer[i] = '1'; carry=0;}
            else if(str1[i]=='1'&&str2[i]=='1') {answer[i] = '1'; carry = 1;}
            else {answer[i]='0'; carry=1;}
        }
    }
    for(i=str2_len;i<str1_len;i++){
        if(carry == 0){
            if(str1[i]=='0') answer[i] = '0';
            else answer[i] = '1';
        }
        else{
            if(str1[i]=='0') answer[i] = '1';
            else {answer[i] = '0'; carry = 1;}
        }
    }
    
    if(carry==1) {answer[str1_len] = '1'; answer[str1_len+1] = '\0';}
    else {answer[str1_len] = '\0';}
    
    strrev(answer);

    return answer;
}