[백준 1193] 분수찾기 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
분수의 순서가 지그재그 형태로 나타난다는 점을 바탕으로, x
번째 분수를 구하는 문제입니다.
우선, x
번째 분수가 어느 대각선에 위치하는지를 찾아야 합니다.
행과 열의 합이 동일한 대각선에서, 행이나 열의 값을 증가시키며 분수를 생성한다는 점을 활용하여 x
번째 분수가 위치하는 대각선을 계산할 수 있습니다.
이후, 대각선의 번호가 짝수인 경우 분수의 순서는 위에서 아래로, 홀수인 경우 분수의 순서는 아래에서 위로 생성된다는 점을 활용하여 x
번째 분수의 위치를 계산합니다.
대각선 번호가 짝수인 경우 위에서 아래로 분수를 생성하므로,
x
번째 분수의 분자는 대각선 번호
- (해당 대각선까지 들어갈 수 있는 총 분수의 개수
- x
) 가 됩니다.
x
번째 분수의 분모는 1
+ (해당 대각선까지 들어갈 수 있는 총 분수의 개수
- x
) 가 됩니다.
대각선 번호가 홀수의 경우에는 아래에서 위로 분수를 생성하므로, 분자와 분모의 계산식이 짝수의 경우와 반대입니다.
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
namespace Solution {
class Program {
static void Main(string[] args) {
var x = int.Parse(Console.ReadLine()!);
int diagonal = 0, cntFractions = 0;
while (cntFractions < x) {
diagonal++;
cntFractions += diagonal;
}
var diff = cntFractions - x;
int numerator = 0, denominator = 0;
if (diagonal % 2 == 0) {
numerator = diagonal - diff;
denominator = 1 + diff;
} else {
numerator = 1 + diff;
denominator = diagonal - diff;
}
Console.WriteLine($"{numerator}/{denominator}");
}
}
}
[ 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
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int x; cin >> x;
int diagonal = 0, cntFractions = 0;
while (cntFractions < x) {
diagonal++;
cntFractions += diagonal;
}
int diff = cntFractions - x;
int numerator, denominator;
if (diagonal % 2 == 0) {
numerator = diagonal- diff;
denominator = 1 + diff;
} else {
numerator = 1 + diff;
denominator = diagonal - diff;
}
cout << numerator << "/" << denominator << "\n";
return 0;
}