다섯 개의 숫자 s, v1, v2, t1, t2가 주어진다고 가정해 봅시다. 아말(Amal)과 비말(Bimal)은 온라인으로 타이핑 게임을 진행하고 있으며, 이 게임에서 두 사람은 길이가 s인 문자열을 입력해야 합니다. 아말은 한 글자를 입력하는 데 v1밀리초가 걸리고, 비말은 한 글자를 입력하는 데 v2밀리초가 걸립니다. 아말의 네트워크 지연 시간은 t1밀리초, 비말의 네트워크 지연 시간은 t2밀리초입니다.
게임 진행 방식
연결 지연이 t밀리초일 때, 참가자의 경기는 다음과 같은 과정으로 진행됩니다.
- 게임 시작 후 정확히 t밀리초가 지나면 참가자가 입력해야 할 텍스트를 전달받습니다.
- 텍스트를 받자마자 곧바로 타이핑을 시작합니다.
- 모든 텍스트 입력을 마친 뒤 정확히 t밀리초가 지나면 사이트에 결과 정보가 전송됩니다.
더 빨리 완료한 참가자가 승자가 되며, 두 참가자의 소요 시간이 같다면 무승부로 처리됩니다. 우리는 이 게임의 승자를 구해야 합니다.
예를 들어 입력이 s = 5, v1 = 1, v2 = 2, t1 = 1, t2 = 2라면, 아말의 결과 정보는 7밀리초 후에, 비말의 결과 정보는 14밀리초 후에 도착합니다. 따라서 출력은 아말(Amal)이며, 아말이 승리합니다.
풀이 접근 방법
이 문제는 각 참가자의 총 소요 시간을 계산한 뒤 서로 비교하는 간단한 방식으로 해결할 수 있습니다. 다음 단계를 따릅니다.
p := (s * v1) + (2 * t1)
q := (s * v2) + (2 * t2)
p와 q가 같다면:
"Draw"를 반환합니다.
p < q라면:
"Amal"을 반환합니다.
그 외의 경우:
"Bimal"을 반환합니다.
여기서 총 소요 시간은 (문자열 길이 × 글자당 입력 시간) + (왕복 네트워크 지연 시간 2회)로 계산됩니다.
예제 코드 (C++)
다음 구현 예시를 통해 더 자세히 이해해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
string solve(int s, int v1, int v2, int t1, int t2) {
int p = (s * v1) + (2 * t1);
int q = (s * v2) + (2 * t2);
if (p == q)
return "Draw";
else if (p < q)
return "Amal";
else
return "Bimal";
}
int main() {
int s = 5;
int v1 = 1;
int v2 = 2;
int t1 = 1;
int t2 = 2;
cout << solve(s, v1, v2, t1, t2) << endl;
}
입력
5, 1, 2, 1, 2
출력
Amal