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 |
댓글
댓글 쓰기