[백준 2863] 이게 분수? (C#, C++) - soo:bak
작성일 :
문제 링크
설명
2 x 2
형태의 수들을 이용해 정의된 분수 값을 회전하며 비교하여, 가장 큰 값을 만드는 회전 횟수를 찾는 문제입니다.
표의 구성은 다음과 같습니다:
1
2
A B
C D
이 때, 표의 값은 \(\frac{A}{C} + \frac{B}{D}\)로 정의됩니다.
이 표를 90도씩 시계 방향으로 회전할 수 있으며,
총 0
, 1
, 2
, 3
번 회전한 상태 중 가장 큰 값을 만드는 회전 횟수를 구해야 합니다.
접근법
- 표의 상태는
90도
씩 총4번
회전 가능한 구조이므로,4번
반복하며 모든 경우를 확인합니다. - 각 회전마다 다음의 값을 계산합니다: \(\frac{왼쪽 위}{왼쪽 아래} + \frac{오른쪽 위}{오른쪽 아래}\)
- 이때, 실제 값이 가장 큰 회전 상태를 기억해두고 그 회전 횟수를 정답으로 출력합니다.
- 회전은 좌표를 시계 방향으로 바꾸는 방식으로 처리합니다:
- 즉,
a b
→c a
→d c
→b d
순으로 회전합니다.
- 즉,
입력 수의 범위가 작기 때문에, 단순한 완전탐색 방식으로 충분히 처리할 수 있습니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
class Program {
static void Main() {
var input1 = Console.ReadLine().Split();
var input2 = Console.ReadLine().Split();
double[,] grid = new double[2, 2];
grid[0, 0] = double.Parse(input1[0]);
grid[0, 1] = double.Parse(input1[1]);
grid[1, 0] = double.Parse(input2[0]);
grid[1, 1] = double.Parse(input2[1]);
double maxVal = -1;
int answer = 0;
for (int i = 0; i < 4; i++) {
double val = grid[0, 0] / grid[1, 0] + grid[0, 1] / grid[1, 1];
if (val > maxVal) {
maxVal = val;
answer = i;
}
double temp = grid[0, 0];
grid[0, 0] = grid[1, 0];
grid[1, 0] = grid[1, 1];
grid[1, 1] = grid[0, 1];
grid[0, 1] = temp;
}
Console.WriteLine(answer);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
double arr[2][2];
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j)
cin >> arr[i][j];
}
double maxV = -1, val;
int ans = 0;
for (int i = 0; i < 4; ++i) {
val = arr[0][0] / arr[1][0] + arr[0][1] / arr[1][1];
if (val > maxV) {
maxV = val;
ans = i;
}
double temp = arr[0][0];
arr[0][0] = arr[1][0];
arr[1][0] = arr[1][1];
arr[1][1] = arr[0][1];
arr[0][1] = temp;
}
cout << ans << "\n";
return 0;
}