Problem A 풀이 (C++)
문제 링크 : https://codeforces.com/contest/1538/problem/A
배열에서 가장 큰 파워를 가진 돌과 작은 파워를 가진 돌의 index를 확인한다.
2개의 돌 중 어느 돌이 왼쪽에 위치하고 오른쪽에 위치하는지 확인한다.
배열의 0 index부터 왼쪽 돌까지의 거리와 배열의 n-1 index부터 오른쪽 돌까지의 거리를 비교하여 더 가까운 돌 제거. ( 실제로 배열에서 지우지는 않는다. )
돌을 제거하고 남은 배열을 기준으로 남은 돌의 왼쪽과 오른쪽 끝부터의 거리를 비교하여 가까운 거리의 방향으로 제거.
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <iostream> #include <vector> using namespace std; int main() { int t; cin >> t; while (t--) { int n; cin >> n; int answer = 0; vector<int> stones(n, 0); // start index, end index at stones vector. int start = 0, end = n - 1; // greatest power and least power stone index. int gindex = 0, lindex = 0; for (int i = 0; i < n; i++) { cin >> stones[i]; if (stones[gindex] < stones[i]) gindex = i; if (stones[lindex] > stones[i]) lindex = i; } int left_stone = gindex, right_stone = gindex; if (gindex > lindex) left_stone = lindex; if (n - gindex > n - lindex) right_stone = lindex; if (left_stone + 1 < n - right_stone) { answer += left_stone + 1; if (right_stone - left_stone < n - right_stone) answer += right_stone - left_stone; else answer += n - right_stone; } else { answer += n - right_stone; if (left_stone + 1 < right_stone - left_stone) answer += left_stone + 1; else answer += right_stone - left_stone; } cout << answer << endl; } return 0; } | cs |
댓글
댓글 쓰기