Problem C 풀이 (C++)

 문제 링크 : https://codeforces.com/contest/1560/problem/C












채워지는 수들 중 가장 윗줄의 수가 채워지는 규칙을 보면,

1  2 (+1)  5 (+3)  10 (+5) ~~ 이런 식이다. 더해지는 수를 d라고 한다면 더해지는 수 d가 한번 더해질 때마다 +2씩 늘어난다.

이 윗줄의 수를 계산해서 a <= k < a + d인 a를 찾는다.

1   2   5   10   ~~   a   a+d 이런 구성이다.

여기서 a의 r = 1, c = ( a까지 채워진 숫자의 개수 ) 가 된다.

숫자가 채워지는 규칙이 윗줄의 수부터 행렬을 둘러싸는 규칙이기 때문에

a의 r, c를 아는 상태로 k에 대해서 r, c의 값을 찾는 규칙은 아래와 같다.

if ( k <= a + d/2 ) -> r = 1 + (k - a), c = c

else if ( k > a + d/2 ) -> r = 1 + d/2, c = c - ( k - ( a + d/2 ) )


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
#include <iostream>
 
using namespace std;
 
int main() {
 
    int t;
    cin >> t;
 
    while (t--) {
 
        int k;
        cin >> k;
 
        int r = 1, c = 1;
        int d = 1;
        int num = 1;
 
        while (!(num <= k && k < num + d)) {
            c++;
            num += d;
            d += 2;
        }
 
        if (k <= num + d / 2)
            cout << r + k - num << " " << c << endl;
        else
            cout << d / 2 + 1 << " " << c - (k - (num + d / 2)) << endl;
    }
 
    return 0;
}
cs

댓글