코드 포스(Code Force) 915 - B. Browser
문제 유형: 구현
문제 URL: https://codeforces.com/contest/915/problem/B
브라우저에 N개의 탭이 열려 있습니다. 각 탭은 차례대로 1번부터 N번에 해당합니다. 현재 마우스 커서는 pos 번 탭에 존재하며 공부하기 위해서 l부터 r까지의 탭을 제외한 나머지 탭은 모두 꺼버리고 싶습니다. 다만 최대한 빠르게 탭을 정리하고자 합니다.
매 초마다 커서를 왼쪽 혹은 오른쪽으로 이동할 수 있습니다. 물론 이동할 때 이미 꺼진 탭 번호로는 이동할 수 없습니다. 예를 들어 1, 2, 3번 탭을 끈 이후에 4번에서 그 왼쪽인 3번 탭으로는 이동할 수 없는 것입니다. 또한 매 초마다 탭을 끌 수 있으며, 탭을 끌 때는 현재 커서가 위치한 탭에서 왼쪽에 있는 모든 탭을 모두 끄거나 오른쪽에 있는 탭을 모두 끄는 방법이 있습니다. 현재 1부터 M까지의 탭이 켜져 있고, 현재 커서가 pos번 탭에 위치한 상태에서 l부터 r까지의 탭을 제외한 나머지 탭을 모두 끄는데 걸리는 가장 빠른 시간을 구하면 되는 문제입니다.
이 문제는 매우 간단한 구현 문제입니다. 일단 l부터 r까지의 탭을 제외한 다른 모든 탭을 꺼야 합니다. 탭을 끌 때는 왼쪽에 있는 모든 탭을 끄거나 오른쪽에 있는 모든 탭을 끄는 방법이 있으므로 왼쪽으로 가는 경우와 오른쪽으로 가는 경우 중에서 더 빠른 경우부터 끄면 됩니다.
답을 구하기 위해서는 가장 먼저 l이 1보다 큰지 확인하여 왼쪽에 있는 탭을 끄러 갈 필요가 있는지 확인합니다. r이 n보다 작은지 또한 고려해야 합니다. 이후에 기본적으로 오른쪽부터 끈다고 가정합니다. 결과적으로 왼쪽 탭 끄는 위치와 오른쪽 탭 끄는 위치 중에서 더 가까운 곳으로 이동하여 먼저 탭을 끈 뒤에 남은 탭으로 이동해서 끄면 됩니다.
※ 예시 입출력 ※
6 3 2 4
5
6 3 1 3
1
5 2 1 5
0
※ 정답 소스코드 ※
(컴파일 환경: GNU G++11 5.1.0)
#include <iostream> #include <algorithm> #include <math.h> using namespace std; int main(void) { int n, pos, l, r; cin >> n >> pos >> l >> r; vector<int> v; int count = 0; // 오른쪽을 꺼야 하는 경우 if(r < n) { v.push_back(1); } // 왼쪽을 꺼야 하는 경우 if(l > 1) { v.push_back(0); } // 왼쪽부터 끄는 게 더 가까운지 if(pos - l <= r - pos) { sort(v.begin(), v.end()); // 왼쪽부터 끄도록 함 } for(int i = 0; i < v.size(); i++) { int direction = v[i]; int target = -1; if(direction == 0) { target = l; } if(direction == 1) { target = r; } count += abs(pos - target) + 1; pos = target; } cout << count; return 0; }
'알고리즘 대회' 카테고리의 다른 글
코드 포스(Code Force) 1075 - B. Taxi drivers and Lyft (0) | 2018.11.12 |
---|---|
코드 포스(Code Force) 1075 - A. The King's Race (0) | 2018.11.11 |
코드 포스(Code Force) 915 - A. Garden (0) | 2018.11.11 |
코드 포스(Code Force) 390 - A. Inna and Alarm Clock (0) | 2018.11.05 |
코드 포스(Code Force) 399 - A. Pages (0) | 2018.11.05 |