문제
선의 진영(6종 유닛)과 악의 진영(7종 유닛)의 병력 수가 주어질 때, 각 유닛별 전투력 가중치를 적용한 총 전투력을 비교하여 승자를 출력하라.
입력
테스트 케이스 수 T, 각 케이스마다 선의 진영 6개 유닛 수와 악의 진영 7개 유닛 수가 주어진다.
출력
선의 진영이 크면 "Good triumphs over Evil", 악이 크면 "Evil eradicates all trace of Good", 같으면 "No victor on this battle field"을 출력한다.
예제
| 입력 | 출력 |
|---|---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 | Battle 1: Evil eradicates all trace of Good |
풀이
각 진영의 유닛별 가중치 배열을 미리 정의하고, 병력 수를 곱해 합산한다.
- 선의 진영 가중치 배열
{1, 2, 3, 3, 4, 10}으로 6개 유닛의 전투력을 합산한다 - 악의 진영 가중치 배열
{1, 2, 2, 2, 3, 5, 10}으로 7개 유닛의 전투력을 합산한다 - 두 진영의 총 전투력을 비교하여 결과 문자열을 출력한다
핵심 아이디어: 가중치 배열을 미리 정의해두면 유닛 수와 곱하여 O(1)에 총 전투력을 계산할 수 있다.
코드
#include <iostream>
using namespace std;
int main(void)
{
int t, g, s, gan[6] = {1, 2, 3, 3, 4, 10}, sa[7] = {1, 2, 2, 2, 3, 5, 10}, ganScore, saScore;
cin >> t;
for (int i = 1; i <= t; i++)
{
ganScore = saScore = 0;
for (int i = 0; i < 6; i++)
{
cin >> g;
ganScore += gan[i] * g;
}
for (int i = 0; i < 7; i++)
{
cin >> s;
saScore += sa[i] * s;
}
cout << "Battle " << i << ": ";
if (ganScore > saScore)
cout << "Good triumphs over Evil\n";
else if (ganScore == saScore)
cout << "No victor on this battle field\n";
else
cout << "Evil eradicates all trace of Good\n";
}
}복잡도
- 시간: O(T)
- 공간: O(1)