Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 구하는 시간 t에 서 있는 관중 수 – 멕시코 웨이브 문제 풀이

n, k, t 세 개의 정수가 주어질 때, 시간 t에 서 있는 관중의 수를 구하는 문제입니다. Amal은 '멕시코 웨이브(Mexican Wave)'를 분석하고 있으며, 1번부터 n번까지 번호가 매겨진 관중 n명이 있고 시간은 0부터 시작합니다.

문제 설명

웨이브는 다음과 같은 규칙으로 진행됩니다.

  • 시간 1에 첫 번째 관중이 일어섭니다.
  • 시간 2에 두 번째 관중이 일어섭니다.
  • 시간 k에 k번째 관중이 일어서고, 시간 k+1에는 (k+1)번째 관중이 일어서는 동시에 첫 번째 관중이 앉습니다.
  • 시간 k+2에는 (k+2)번째 관중이 일어서고 두 번째 관중이 앉습니다.
  • 시간 n에는 n번째 관중이 일어서고 (n−k)번째 관중이 앉습니다.
  • 시간 n+1부터는 더 이상 새로 일어서는 사람이 없으며, (n+1−k)번째 관중부터 차례로 앉기 시작합니다.

이때 시간 t에 서 있는 관중이 몇 명인지 구해야 합니다.

예를 들어 입력이 n = 10, k = 5, t = 3이라면 출력은 3입니다. 아직 시간 5가 되지 않아 아무도 앉지 않았고, 1번부터 3번까지 관중이 모두 서 있기 때문입니다.

접근 방법

이 문제는 시간 t를 세 구간으로 나누어 생각하면 간단하게 해결할 수 있습니다.

  • 오르는 구간 (t ≤ k): 아직 아무도 앉지 않았으므로 서 있는 관중 수는 t명입니다.
  • 유지되는 구간 (k < t ≤ n): 한 명이 일어설 때마다 한 명씩 앉기 때문에, 서 있는 관중 수는 항상 k명으로 유지됩니다.
  • 내려가는 구간 (t > n): 모든 관중이 일어선 후에는 앉는 사람만 발생합니다. 시간 t에 서 있는 관중 수는 n + k − t명입니다.

따라서 다음 세 값 중 최솟값을 반환하면 됩니다.

min(t, k, n + k − t)

예를 들어 n = 10, k = 5일 때 t = 12라면, 10 + 5 − 12 = 3이 되어 서 있는 관중은 3명입니다.

C++ 구현 예제

#include <bits/stdc++.h>
using namespace std;

int solve(int n, int k, int t){
   return min({ t, k, n + k - t });
}

int main(){
   int n = 10;
   int k = 5;
   int t = 3;
   cout << solve(n, k, t) << endl;
}

입력

10, 5, 3

출력

3