알고리즘
[C++] 백준 1193번 분수찾기
J3SUNG
2019. 8. 23. 00:00
728x90
수학 문제입니다.
n번째 위치에 올 분수를 출력하는 문제입니다.
1/1부터 지그재그 모양으로 움직입니다.
대각선으로 보았을 때
첫번째 줄 1/1 은 합이 2입니다.
2번째 줄은 합이 3입니다.
3번째 줄은 합이 4입니다.
.....
대각선이 하나씩 증가할 때마다 합이 1씩 증가합니다.
이를 이용하기 위해 대각선으로 잘라줍니다.
n과 1을 비교하고
n과 1+2를 비교하고
n과 1+2+3을 비교하고
.....
숫자를 1씩 증가한 후 더하면서 n과 비교하고 작아질때의 순서를 찾습니다.
(1씩 증가하는 이유는 대각선 모양을 보면 1 - 2 - 3 - 4 - 5 처럼 1씩 증가하는 모습을 볼 수 있다.)
14의 경우 1+2+3+4+5 = 15가 되었을 때 확인을 할 수 있습니다.
여기서 5번째 대각선이라는 것을 확인할 수 있고 합이 6을 만드는 분수라는 것을 알 수 있습니다.
이때 지그재그가 위에서 내려오는지 밑에서 올라가는지 알기위해
대각선이 짝수의 경우 위에서 내려오고, 홀수의 경우 밑에서 올라갑니다.
나머지 연산을 통해서 짝수인지, 홀수인지 파악한 후
int a, b를 정의한 후
a는 0
b는 k + 1 (k는 대각선 위치)
을 해주고
for문을 돌려서
a += 1;
b -= 1;
을 해주면서 위치를 찾을 수 있습니다.
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int n;
cin >> n;
int k = 1;
int num = 0;
while (1) {
num += k;
if (n <= num) {
break;
}
++k;
}
int a;
int b;
if (k % 2) {
a = k + 1;
b = 0;
for (int i = 1; i <= n - num + k; ++i) {
a -= 1;
b += 1;
}
}
else {
a = 0;
b = k + 1;
for (int i = 1; i <= n - num + k; ++i) {
a += 1;
b -= 1;
}
}
cout << a << "/" << b << endl;
return 0;
}