문제
크로아티아의 TV 퀴즈쇼 시뮬레이션 문제이다. 방송은 최대 210분 동안 진행되며, 시작 채널 k에서 시작한다. 각 라운드마다 소요 시간 t와 정답 여부 ans(T/F)가 주어진다. 누적 시간이 210분을 넘으면 방송이 종료되고 현재 채널을 출력한다. 정답(T)이면 채널이 1 증가하며, 9채널을 넘으면 1로 돌아온다.
입력
첫 번째 줄에 시작 채널 k와 라운드 수 q가 주어진다. 이후 q줄에 걸쳐 각 라운드의 소요 시간 t와 정답 여부 ans(T 또는 F)가 주어진다.
출력
방송 종료 시점의 채널 번호를 출력한다.
예제
| 입력 | 출력 |
|---|---|
3 3 100 T 100 F 100 T | 3 |
풀이
라운드마다 시간을 누적하면서 210분 초과 조건과 채널 변경 조건을 시뮬레이션한다.
- 시작 채널 k와 라운드 수 q를 입력받는다.
- 각 라운드에서 소요 시간 t와 정답 여부 ans를 읽는다.
- 누적 시간
time += t가 210 이상이면 현재 채널 k를 출력하고 종료한다. - 정답이
T이면 k를 1 증가시키고, k가 9를 초과하면 1로 순환시킨다. - 모든 라운드가 끝난 후에도 종료되지 않으면... (주어진 조건상 210분 내 종료 보장)
핵심 아이디어: 시간 누적을 먼저 확인하고 채널 변경을 나중에 처리하는 순서가 중요하다. 채널 순환은 k == 9일 때 k = 1로 리셋하는 방식으로 처리한다.
코드
#include <iostream>
using namespace std;
int main()
{
int k, q;
int time = 0;
cin >> k >> q;
while (q--)
{
int t;
char ans;
cin >> t >> ans;
time += t;
if (time >= 210)
{
cout << k;
break;
}
if (ans == 'T')
{
k++;
if (k == 9)
k = 1;
}
}
}복잡도
- 시간: O(Q) — Q개의 라운드를 순차 처리
- 공간: O(1) — 채널, 시간, 라운드 카운터만 사용