문제풀이/백준oj
[백준OJ] 11034번 캥거루 세마리2
Hyeon-Uk
2021. 6. 20. 02:27
반응형
https://www.acmicpc.net/problem/11034
11034번: 캥거루 세마리2
여러개의 테스트 케이스로 이루어져 있으며, 세 캥거루의 초기 위치 A, B, C가 주어진다. (0 < A < B < C < 100)
www.acmicpc.net
-풀이-
세마리의 캥거루의 위치를 A,B,C라고 해보겠다.
양쪽 캥거루중 한마리가 나머지 두 캥거루의 사이로 가야된다. 이때, A-B사이의 거리와, B-C사이의 거리를 구한뒤, 더 작은쪽거리에 있는 캥거루를, 긴 거리에있는 캥거루 사이에 둔다. 왜냐면, 점프횟수를 최대로 해야하므로, 기회가 더 많이 생길 수 있도록 작은쪽의 캥거루를 긴 캥거루 사이로 넣어야된다.
그럼 거리가 긴 캥거루 사이 어디에 놔야할까? 답은 간단하다.점프를 최대로 하려면 캥거루 두마리중 하나와 딱 붙여놓으면 된다.
예를들어 캥거루의 위치가 3 / 5 / 9에 있다고 하자.
왼쪽 거리는 2, 오른쪽 거리는 4이므로, 1번째 캥거루를 2~3 사이에 점프시킬것이다. 이때 2번위치에 있는 캥거루에 붙이면 5 / 6 / 9 가 된다.
다음으로, 왼쪽거리는 1이되고, 오른쪽은 3이되므로, 1번째 위치의 캥거루를 2~3 사이에 점프시킬것이다. 이때도 2번 위치에 있는 캥거루 옆에 붙이면 6 / 7 / 9 가 된다.
위와 마찬가지로 다음 단계를 진행하면 7 / 8 / 9가 되면서 점프의 횟수는 최대가 된다.
-시간복잡도-
O(1)
-코드-
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<string> v;
int main() {
int a, b, c;
while (cin >> a >> b >> c) {
int cnt = 0;
while (true) {
if (b - a == 1 && c - b == 1) break;
int lgap = (b - a);
int rgap = (c - b);
if (lgap < rgap) {
a = b;
b = b + 1;
}
else {
c = b;
b = b - 1;
}
cnt++;
}
cout << cnt<<"\n";
}
return 0;
}
반응형