Problem Solving/BOJ

[백준 / BOJ] C++ 29156 탭 UI

nageune 2023. 9. 4. 23:29
728x90
반응형

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;
}

 

728x90
반응형