반응형
문제에서 주어진 표는 다음과 같다.
1/1 | 1/2 | 1/3 | 1/4 | 1/5 | … |
2/1 | 2/2 | 2/3 | 2/4 | … | … |
3/1 | 3/2 | 3/3 | … | … | … |
4/1 | 4/2 | … | … | … | … |
5/1 | … | … | … | … | … |
… | … | … | … | … | … |
각 대각선에서 분모는 ↗ 방향으로 증가하고, 분자는 ↙ 방향으로 증가한다.
주어진 표에서 방문 순서대로 값을 메기면,
1 | 2 | 6 | 7 | 15 | … |
3 | 5 | 8 | 14 | … | … |
4 | 9 | 13 | … | … | … |
10 | 12 | … | … | … | … |
11 | … | … | … | … | … |
… | … | … | … | … | … |
사실 나는 문제를 제대로 읽지 않아, 아래처럼 생각했었다.
1 | 2 | 4 | 7 | 11 | … |
3 | 5 | 8 | 12 | … | … |
6 | 9 | 13 | … | … | … |
10 | 14 | … | … | … | … |
15 | … | … | … | … | … |
… | … | … | … | … | … |
하지만 결정적으로 이러한 실수가 답을 해결하는데 큰 도움이 됐다.
맨 윗줄을 차례대로 보면, 누적합이 된다는 것을 알 수 있다.
$${1, 1+1, 1+1+2, 1+1+2+3, 1+1+2+3+4, ... }$$
따라서 X가 주어졌을 때 이 수보다 큰 누적합 중 제일 작은 수가 있는 대각선이 X가 있는 대각선인 것이다.
즉, $$ X ≥ S=1+\sum_{n=1}^{i}{n} $$를 만족하는 i와 S를 알면 답을 구할 수 있다.
그리고 대각선에서 몇 번째인지를 알려면, \(S - X\)를 통해 ↙방향(또는 ↗방향) 순서를, \(S + i - X\)를 통해 ↗방향(또는 ↙방향) 순서를 알 수 있다. 매 대각선마다 방향을 반대로 적용해주면 된다.
아래는 코드 전문이다.
#define EL "\n"
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
int X;
cin >> X;
int i = 0;
int sum = 1;
while (sum + i <= X) {
sum += i;
i++;
}
if (i % 2 == 0)
cout << X - sum + 1 << "/" << sum + i - X << EL;
else
cout << sum + i - X << "/" << X - sum + 1 << EL;
return 0;
}
반응형
'프로그래밍 > PS' 카테고리의 다른 글
[C++] 백준 2447번: 별 찍기 - 10 (0) | 2020.10.22 |
---|---|
[C++] 백준 1011번: Fly me to the Alpha Centauri (0) | 2020.10.19 |
[C++] 백준 2941번: 크로아티아 알파벳 (0) | 2020.10.19 |
[C++] 백준 1074번: Z (0) | 2020.10.18 |
[C++] 백준 2630번: 색종이 만들기 (0) | 2020.10.18 |