Problem B 풀이 (C++)

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

a와 b는 마주 보고 있다. a < b라고 하자. ( a가 더 크다면 값을 바꾼다. )

a와 b가 마주 보고 있을 수 있도록 원을 구성하기 위해서는 a ~ b, b ~ a 2가지 범위에

숫자의 개수는 b - a - 1개여야 한다.


그렇다면 일단 첫 번째 범위에는 무조건 a, ( b - a - 1개의 숫자 ), b로 구성되어 있다.

그리고 두 번째 번위는 b ~ a인데, 여기서 생각해야 할 점은 a가 어떤 수냐에 따라

1 ~ a - 1까지의 숫자가 이 범위에 포함되고 나머지 자리에 b보다 큰 숫자들이 차례대로 구성되어 있어야 한다는 것이다.

그렇다면 원이 구성되기 위해서는 1 ~ a - 1까지의 숫자 개수가 b - a - 1개의 숫자보다 크지 않아야 한다.

b - a - 1개라면 1 ~ a - 1까지의 수로 구성되어 있는 것이고,

b - a - 1개보다 작다면 1 ~ a - 1, 나머지 개수는 b+1, b+2, ~~로 구성되어 있는 것이다.


여기까지 확인했으면 일단 입력된 a와 b로 올바른 원을 구성할 수 있다는 의미다.

( 예를 들어 a = 2, b = 3 이라면 숫자로 원을 그려봤을 때 a와 b가 마주 보고 있는 원이 안 그려진다. )

올바른 원이 그려졌다면 이제 c가 원의 범위에 들어가는지 확인한다.

c가 범위에 들어간다면,

if ( c <= 원을 구성하는 가장 큰 수 ) -> c + (b - a)

else if ( c > 원을 구성하는 가장 큰 수 ) -> (c + (b - a)) % 원을 구성하는 가장 큰수

가 답이 된다.


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
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
int main() {
 
    int t;
    cin >> t;
 
    while (t--) {
 
        int a, b, c;
        cin >> a >> b >> c;
 
        if (a > b)
            swap(a, b);
 
        int sidenum = b - a - 1;
 
        if (a - 1 > sidenum) {
            cout << -1 << endl;
            continue;
        }
 
        sidenum -= a - 1;
 
        int biggest = b + sidenum;
 
        if (1 <= c && c <= biggest) {
            if (c + b - a > biggest)
                cout << (c + b - a) % biggest << endl;
            else
                cout << c + b - a << endl;
        }
        else
            cout << -1 << endl;
    }
 
    return 0;
}
cs

댓글