
29156번: 탭 UI
문제
https://www.acmicpc.net/problem/29156
29156번: 탭 UI
탭 UI는 여러 탭이 일렬로 나열되어 특정 탭을 클릭하면 해당 탭에 대한 내용을 확인할 수 있는 UI(User Interface)이다. 화면 내에 있는 탭은 노출되고 좌우로 화면을 벗어난 탭은 노출되지 않으며 사
www.acmicpc.net
풀이
각 탭의 길이를 입력받을 때 누적합(prefix_sum) 배열을 만들어 전체 길이를 기록한다. 그리고 각각의 탭의 중앙의 좌표를 저장한 coordinate 배열을 만든다. 화면의 길이의 절반(화면의 중앙)을 mid라고 한다.
그리고 클릭한 탭 x가 주어졌을 때, mid에 위치하기 위해 coordinate[x]가 얼마나 이동해야 하는지를 gap이라고 한다. gap을 통해 좌표 0을 기준으로 탭이 양의 방향으로 움직여야하는지, 음의 방향으로 움직이는지를 판별할 수 있다.
1. 만약 gap이 0 이상인 경우(좌표 0을 기준으로 화면을 더 양의 방향으로 옮겨야 하는 경우), 탭을 더 이상 옮길 수 없으므로 0을 출력한다.
또는 모든 탭의 길이의 합이 화면의 길이보다 작은 경우 어떤 탭이 클릭하더라도 0을 출력한다.
2. 만약 탭을 중앙에 위치시켰을 때, (모든 탭의 길이의 합 - 현재 탭의 중심 좌표)가 화면 크기의 절반보다 작은 경우, 더 이상 탭을 음의 방향으로 옮길 수 없는 상황이므로 좌표는 (모든 탭의 길이의 합 - 화면의 크기)가 된다.
3. 그 외의 경우, 탭을 스크롤 하더라도 스크롤이 양 끝에 닿지 않는 경우이기 때문에 gap의 절댓값이 스크롤의 좌표가 된다. (절댓값인 이유는 화면의 중앙보다 오른쪽에 있는 탭들만 좌표를 이동시킬 필요가 있기 때문 -> 즉, 음의 방향)
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, l, q;
cin >> n;
vector<int> length(n + 1), prefix_sum(n + 1, 0);
vector<double> coordinate(n + 1);
for (int i = 1; i <= n; i++) {
cin >> length[i];
prefix_sum[i] = length[i] + prefix_sum[i - 1];
coordinate[i] = prefix_sum[i] - (double)length[i] / 2;
}
cin >> l >> q;
cout.precision(2);
cout << fixed;
double mid = (double)l / 2;
while (q--) {
int x;
cin >> x;
double gap = mid - coordinate[x];
if (gap >= 0 || prefix_sum[n] < l)
cout << (double)0;
else if ((double)prefix_sum[n] - coordinate[x] < (double)l / 2)
cout << (double)prefix_sum[n] - l;
else
cout << -gap;
cout << '\n';
}
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 29160 나의 FIFA 팀 가치는? (2) | 2023.09.05 |
---|---|
[백준 / BOJ] C++ 29159 케이크 두 개 (2) | 2023.09.05 |
[백준 / BOJ] C++ 29155 개발자 지망생 구름이의 취업 뽀개기 (2) | 2023.09.04 |
[백준 / BOJ] C++ 28683 피타! 피타! 피타츄! (2) | 2023.08.17 |
[백준 / BOJ] C++ 28682 재우야 임관하자 (2) | 2023.08.17 |