BOJ

백준 2863번 이게 분수? [C언어]

Sloth Coder 2022. 8. 13. 21:04

Sol)

#include <stdio.h>

int main()
{
    double nums[5];
    double max;
    int cnt = 0;

    for(int i = 0; i < 4; i++)
        scanf("%lf", &nums[i]);

    max = nums[0] / nums[2] + nums[1] / nums[3];

    for(int k = 1; k < 4; k++){ //총 회전은 3번 하므로
        nums[4] = nums[2];
        nums[2] = nums[3];
        nums[3] = nums[1];
        nums[1] = nums[0];
        nums[0] = nums[4];

        if(max < nums[0] / nums[2] + nums[1] / nums[3]) {
            max = nums[0] / nums[2] + nums[1] / nums[3];
            cnt = k; //그냥 cnt++로 해버리면, max값이 갱신될 때만 카운트가 되기때문에
        }            //몇번째 회전의 max값인지 알 수 있게 하기 위해 회전 카운트값인 k를 대입해줘야 한다.
    }

    printf("%d\n", cnt);

    return 0;
}

 

입력은 정수들이나, 분수 계산에서 최대값을 찾는 문제이므로 실수형으로 계산 결과가 나와야 한다. int형들의 계산 결과를 double로 캐스팅하는 방법도 있지만, 그냥 처음부터 변수들을 double로 선언했다. 문제에 나온 이미지가 2차원 배열같지만, 2차원 배열로 푸는 것과 1차원 배열로 푸는 것이 다를바가 없어 그냥 1차원 배열을 선언했다.

A,B,C,D 총 4자리가 필요하다. 크기 4의 배열을 딱맞게 선언해도 되지만, 배열을 돌릴 때 값 하나를 임시로 저장할 공간이 하나 필요해서 temp를 따로 선언하기 보다는 크기 5의 배열로 선언했다. 

 

 

배열을 돌리는 로직은 다음과 같이 C언어에서 두 값을 교환하는 로직의 응용이었다. 

int a = 1, b = 2;
int temp;

temp = a;
a = b;
b = temp;

 

 

의외로 시간을 사용한 곳은, cnt파트였는데, 처음에는 cnt = k + 1; 이 아니라 cnt++;로 써서 계속 틀렸기 때문이다.