티스토리 뷰

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비 - 인프런 | 강의

모든 문제에 대한 저작권은 위 강의에 있습니다.

문제

0부터 9까지의 숫자가 표시된 카드를 가지고 두 사람 A와 B가 게임을 한다. A와 B에게는 각각 0에서 9까지의 숫자가 하나씩 표시된 10장의 카드뭉치가 주어진다. 두 사람은 카드를 임의의 순서로 섞은 후 숫자가 보이지 않게 일렬로 늘어놓고 게임을 시작한다. 단, 게임 도중 카드의 순서를 바꿀 수는 없다. A와 B 각각이 늘어놓은 카드를 뒤집어서 표시된 숫자를 확인하는 것을 한 라운드라고 한다. 게임은 첫 번째 놓인 카드부터 시작하여 순서대로 10번의 라운드로 진행된다. 각 라운드에서는 공개된 숫자가 더 큰 사람이 승자가 된다. 승자에게는 승점 3점이 주어지고 패자에게는 승점이 주어지지 않는다. 만약 공개된 두 숫자가 같아서 비기게 되면, A, B 모두에게 승점 1점이 주어진다. 10번의 라운드가 모두 진행된 후, 총 승점이 큰 사람이 게임의 승자가 된다. 만약, A와 B의 총 승점이 같은 경우에는, 제일 마지막에 이긴 사람을 게임의 승자로 정한다. 그래도 승부가 나지 않는 경우는 모든 라운드에서 비기는 경우뿐이고 이 경우에 두 사람은 비겼다고 한다. 예를 들어, 다음 표에서 3번째 줄은 각 라운드의 승자를 표시하고 있다. 표에서 D는 무승부를 나타낸다. 이 경우에 A의 총 승점은 16점이고, B는 13점이어서, A가 게임의 승자가 된다.

라운드 1 2 3 4 5 6 7 8 9 10

A 4 5 6 7 0 1 2 3 9 8
B 1 2 3 4 5 6 7 8 9 0
C A A A A B B B B D A

아래 표의 경우에는 A와 B의 총 승점은 13점으로 같다. 마지막으로 승부가 난 라운드는 7번째 라운드이고, 이 라운드의 승자인 B가 게임의 승자가 된다.

라운드 1 2 3 4 5 6 7 8 9 10

A 9 1 7 2 6 3 0 4 8 5
B 6 3 9 2 1 0 7 4 8 5
C A B B D A A B D D D

A와 B가 늘어놓은 카드의 숫자가 순서대로 주어질 때, 게임의 승자가 A인지 B인지, 또는 비겼는지 결정하는 프로그램을 작성하시오.

입력 설명

첫 번째 줄에는 A가 늘어놓은 카드의 숫자들이 빈칸을 사이에 두고 순서대로 주어진다. 두 번 째 줄에는 B가 늘어놓은 카드의 숫자들이 빈칸을 사이에 두고 순서대로 주어진다.

출력 설명

첫 번째 줄에는 게임이 끝난 후, A와 B가 받은 총 승점을 순서대로 빈칸을 사이에 두고 출력한다. 두 번째 줄에는 이긴 사람이 A인지 B인지 결정해서, 이긴 사람을 문자 A 또는 B로 출력한다. 만약 비기는 경우에는 문자 D를 출력한다.

입력 예제 1

4 5 6 7 0 1 2 3 9 8
1 2 3 4 5 6 7 8 9 0

출력 예제 1

16 13
A

출처 : 한국정보올림피아드

제출 코드

2023년 2월 8일

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<int> CardGame(vector<int> A, vector<int> B)
{
		vector<int> result;
		int ASum = 0;
		int BSum = 0;
		int winner = 68;
		vector<int> gameResult;
	
		int length = A.size();
		for (int i = 0; i < length; i++)
		{
				if (A[i] > B[i])
				{
						gameResult.push_back(1);
						ASum += 3;
				}
				else if (A[i] < B[i])
				{
						gameResult.push_back(2);
						BSum += 3;
				}
				else
				{
						gameResult.push_back(0);
						ASum++;
						BSum++;
				}
		}
	
		result.push_back(ASum);
		result.push_back(BSum);
	
		if (ASum == BSum)
		{
				for (int i = 9; i > 0; i--)
				{
						if (gameResult[i] == 0)
								continue;
					
						if (gameResult[i] == 1)
						{
								winner = 65;
								result.push_back(winner);
								break;
						}
						else if (gameResult[i] == 2)
						{
								winner = 66;
								result.push_back(winner);
								break;
						}
				}
		}
		else
				winner = ASum > BSum ? 65 : 66;
	
		result.push_back(winner);
	
		return result;
}

int main()
{
		ios_base::sync_with_stdio(false);
		cin.tie(NULL);
		cout.tie(NULL);
	
		vector<int> A(10);
		vector<int> B(10);
	
		char winner = ' ';
		vector<int> result;
	
		int length = A.size();
		for (int i = 0; i < length; i++)
		{
				cin >> A[i];
		}
		for (int i = 0; i < length; i++)
		{
				cin >> B[i];
		}
	
		result = CardGame(A, B);
	
		cout << result[0] << ' ' << result[1] << '\\n';
		cout << (char)result[2];
	
		return 0;
}

처음 푼 코드이다.

풀이

<aside> ☝ **CARD GAME RULE 🃏**

  1. 10번의 라운드가 진행된다
  2. 가장 높은 카드를 내는 사람이 해당 라운드를 이기며 3점을 가진다. 패자는 0점.
  3. 같은 수를 내게되면 비기며 각각 1점을 가져간다.
  4. 총 승점이 큰 사람이 이긴다.
  5. 다만, 총 승점이 같을 경우 마지막 라운드를 이기는 사람이 이긴다. 고로, 총 승점이 같고 모든 판이 비겨야지만 비긴게 된다. </aside>

문제를 이해하기까지 시간이 조금 드는 문제였다.

다른 방법으로 풀어보자면 다음과 같다.

A, B가 이겼을 때 각각 숫자를 정해서 구분해준다. 회차당 계산할 때마다 마지막으로 누가 이겼는지도 확인한다. 그렇게 되면 내가 짠 코드처럼 한 번 더 for문을 돌 필요가 없다.

'😈 알고리즘 > 🍃 인프런 #1' 카테고리의 다른 글

🙏 23. 연속 부분 증가수열  (0) 2023.03.13
🙏 22. 온도의 최대값  (0) 2023.03.12
🙏 20. 가위 바위 보  (0) 2023.03.10
🙏 19. 분노 유발자  (0) 2023.03.09
🙏 18. 층간소음  (0) 2023.03.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
링크
Total
Today
Yesterday