<aside> 1️⃣

1560번: 비숍

N*N 크기 체스판에 세울 수 있는 최대 비숍의 수 구하기

</aside>

#include <stdio.h>
#include <string.h>

//최대 비숍의 수는 2N-2 임
//입력이 70자리 정수이기 때문에 구현 어려움

//문자열 N 받아 2*N하기
void timesTwo(char *n, char *result) {
    int len = strlen(n);
    int carry = 0, idx = 0;
    char temp[100] = {0};

    //가장 뒷자리부터 2 곱하기
    for (int i = len - 1; i >= 0; i--) {
        int num = (n[i] - '0') * 2 + carry;
        temp[idx++] = (num % 10) + '0';
        carry = num / 10;
    }
    if (carry) temp[idx++] = carry + '0';

    //뒤집어 저장
    for (int i = 0; i < idx; i++)
        result[i] = temp[idx - 1 - i];
    result[idx] = '\\0';
}

//-2 하는 함수
void minusTwo(char *n) {
    int len = strlen(n);
    int i = len - 1;

    int borrow = 2;

    //뒷자리부터 2 빼기
    //빌려오는 경우 고려
    while (borrow > 0) {
        int digit = n[i] - '0';
        if (digit >= borrow) {
            n[i] = (digit - borrow) + '0';
            borrow = 0;
        } else {
            n[i] = (digit + 10 - borrow) + '0';
            borrow = 1;
        }
        i--;
    }

    //맨 앞자리 0일 시 제거
    if (n[0] == '0') {
        memmove(n, n + 1, strlen(n));
    }
}

int main() {
    char N[80];
    scanf("%s", N);

    //N=1인 경우
    if (strcmp(N, "1") == 0) {
        printf("1\\n");
        return 0;
    }

    char doubled[100] = {0};
    timesTwo(N, doubled); //2*N
    minusTwo(doubled); //2*N-2

    printf("%s\\n", doubled);
    return 0;
}

image.png

<aside> 2️⃣

1735번: 분수 합

두 분수가 주어졌을 때 그 합을 기약분수 형태로 구하는 프로그램을 작성

</aside>

#include <stdio.h>

//최대공약수(GCD) 계산
int gcd(int a, int b) {
    while (b != 0) {
        int t = a % b;
        a = b;
        b = t;
    }
    return a;
}

int main() {
    int A, B, C, D;
    scanf("%d %d", &A, &B);  //첫 번째 분수 A/B
    scanf("%d %d", &C, &D);  //두 번째 분수 C/D

    //두 분수의 합 = (A*D + C*B) / (B*D)
    long long numerator = (long long)A * D + (long long)C * B;  //분자
    long long denominator = (long long)B * D;                   //분모

    //기약분수를 위해 gcd로 나눔
    int g = gcd(numerator, denominator);

    numerator /= g;
    denominator /= g;

    printf("%lld %lld\\n", numerator, denominator);

    return 0;
}

image.png