본문 바로가기

C언어

2025년 여름학기 3주차 C언어

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

// 킹이 이동가능한 8가지 방향을  x, y 변화량으로 나타낸다
int dx[8] = {1, -1, 0, 0, 1, -1, 1, -1};
int dy[8] = {0, 0, -1, 1, 1, 1, -1, -1};

// 문제에서 나온 이동 명령어에 대응하는 문자열 배열
char *v[8] = {"R", "L", "B", "T", "RT", "LT", "RB", "LB"};

// 이동 명령어를 변환해주는 함수
int change(char *move) {
    for (int i = 0; i < 8; i++) {
        if (strcmp(move, v[i]) == 0)
            return i; // 해당 명령어와 일치하면 반환
    }
    return -1; 
}

int main() {
    char king[3], stone[3];
    int n;

    // 
    scanf("%s %s %d", king, stone, &n);

    // 입력된 문자열의 위치를 체스판 좌표(0~7)로 변환한다
    int kx = king[0] - 'A';  // 열: A~H -> 0~7
    int ky = king[1] - '1';  // 행: 1~8 -> 0~7
    int sx = stone[0] - 'A';
    int sy = stone[1] - '1';

    for (int i = 0; i < n; i++) {
        char move[3];
        scanf("%s", move); // 이동 명령 입력한다

        int v_change = change(move); // 이동 명령어를 change함수로 변환한다
        if (v_change == -1) continue; 
        // 킹이 이동할 좌표 계산
        int nkx = kx + dx[v_change]; //nkw은 새로운 kw그런거다 nky도 그렇다
        int nky = ky + dy[v_change];

        // 체스판 범위 안에 킹이 있는지 확인을 가장 먼저 한다
        if (nkx >= 0 && nkx < 8 && nky >= 0 && nky < 8) {
            // 이동할 위치에 돌이 있으면
            if (nkx == sx && nky == sy) {
                // 돌도 같은 방향으로 한 칸 이동
                int nsx = sx + dx[v_change];
                int nsy = sy + dy[v_change];

                // 돌이 체스판 범위 안에 있어야 이동 가능
                if (nsx >= 0 && nsx < 8 && nsy >= 0 && nsy < 8) {
                    kx = nkx;
                    ky = nky;
                    sx = nsx;
                    sy = nsy;
                }
                // 돌이 체스판 밖이면 킹과 돌 모두 이동하지 않음
            } else {
                // 돌과 부딪히지 않으면 킹만 이동
                kx = nkx;
                ky = nky;
            }
        }
    }

    printf("%c%d\n", kx + 'A', ky + 1);
    printf("%c%d\n", sx + 'A', sy + 1);

    return 0;
}

#include <stdio.h>

long long X, Y;

int main() {
    scanf("%lld %lld", &X, &Y);

    // 현재 승률을 계산한다
    long long Z = (Y * 100) / X;

    // 이분 탐색 범위 설정
    long long left = 1, right = 1e9, a = -1;

    // 이분 탐색을 시작
    while (left <= right) {
        long long mid = (left + right) / 2; 
        // mid는 현재 검사할 추가 경기 수

        // mid 만큼 더 이겨서 새 승률 계산
        long long Z_2 = ((Y + mid) * 100) / (X + mid);

        if (Z_2> Z) {
            // 승률이 현재보다 클 시 조건을 만족한다.
            a = mid;       
            right = mid - 1;  
        } else {
            // 승률이 오르지 않았기에 더 큰 수가 필요하다. 
            left = mid + 1;   
        }
    }

 
    printf("%lld\n", a);
    return 0;
}

'C언어' 카테고리의 다른 글

2025년 여름학기 5주차 C언어  (1) 2025.07.27
2025년 여름학기 4주차 C언어  (3) 2025.07.19
2025년 여름학기 2주차 C언어  (0) 2025.07.06
2025년 여름학기 1주차 C언어  (0) 2025.06.29
2025년 1학기 8주차 C언어  (0) 2025.05.25