Posts [백준] 2511번 - 카드놀이
Post
Cancel

[백준] 2511번 - 카드놀이


백준 온라인 저지의 2511번 카드놀이 문제입니다.

[링크] https://www.acmicpc.net/problem/2511


문제 조건과 설명

  • 0부터 9까지의 숫자가 표시된 카드로 두 사람 A, B가 게임을 진행합니다.
  • 두 사람은 0부터 9까지의 숫자 카드 10장을 가지고 있습니다.
  • 두 사람은 카드를 뒤섞어 10장의 카드를 늘어놓고, 각각 카드를 뒤집어서 표시된 숫자를 확인합니다. 이것을 한 라운드로 정합니다.
  • 카드는 놓인 순서대로 뒤집습니다. 각 라운드에서 더 숫자가 큰 카드를 뒤집은 사람이 이기게 되고, 이길 경우 승점 3점을 받습니다.
    • 둘 다 같은 카드였을 경우, 모두가 승점 1점을 받습니다.
    • 10라운드까지 모두 진행한 뒤에도 승점이 동일했다면, 가장 마지막으로 이긴 사람이 승자가 됩니다.
    • 모든 라운드에서 비겼다면, 전체 결과는 비겼다고 출력해야 합니다.

Input

첫째 줄에는 A가 늘어놓은 순서대로 카드의 숫자들, 두번째 줄에는 B가 늘어놓은 순서대로 카드의 숫자들이 각각 10개씩 주어집니다.


Output

게임이 끝나고 A, B가 받은 총 승점을 순서대로 출력하고, 그 다음 줄에는 누가 이겼는지 A, B, D 중 하나를 출력합니다. D는 비겼을 경우입니다.


생각한 아이디어

A, B를 위한 int 배열 (length=10) 두 개를 선언합니다.

그리고 같은 인덱스의 A, B 요소를 비교해서 승점을 부여합니다.

승점을 부여할 때마다 스택에 누가 이겼었는지 push합니다. 이는 승점이 같아서 가장 마지막으로 이긴 사람이 누구인지 판단하기 위함입니다.

(C++의 STL 활용도를 높여 보고자 스택을 사용했으며, 이 문제는 굳이 스택 자료구조가 있지 않더라도 풀 수 있습니다.)


소스코드 1 - stack을 사용

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;

int main() {

	stack<char> s;
	int A[10], B[10];
	int score_A = 0, score_B = 0;
	char team;

	cin.tie(NULL);
	cout.tie(NULL);

	for (int i = 0; i < 10; i++)
		cin >> A[i];
	for (int i = 0; i < 10; i++)
		cin >> B[i];

	for (int round = 0; round < 10; round++) {
		// A가 우승 시
		if (A[round] > B[round]){
			score_A += 3;
			s.push('A');
		}
		// B가 우승 시
		else if (A[round] < B[round]) {
			score_B += 3;
			s.push('B');
		}
		else if (A[round] == B[round]) {
			score_A += 1;
			score_B += 1;
			s.push('D');
		}
	}
	
	if (score_A > score_B)
		cout << score_A << " " << score_B << "\n" << "A";
	else if(score_A < score_B)
		cout << score_A << " " << score_B << "\n" << "B";
	else if (score_A == score_B) {
		for (int k = 0; k < 10; k++) {
			team = s.top();

			if (team == 'A') {
				cout << score_A << " " << score_B << "\n" << "A";
				return 0;
			}
			else if (team == 'B') {
				cout << score_A << " " << score_B << "\n" << "B";
				return 0;
			}
			s.pop();

			if (s.empty()) {
				cout << score_A << " " << score_B << "\n" << "D";
				return 0;
			}
		}
	}

}

소스코드 2 - 조건문으로만 구현

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>

int main() {

	int A[10], B[10];
	int score_A = 0, score_B = 0;
	char team;

	for (int i = 0; i < 10; i++)
		scanf("%d",&A[i]);
	for (int i = 0; i < 10; i++)
		scanf("%d",&B[i]);

	for (int round = 0; round < 10; round++) {
		// A가 우승 시
		if (A[round] > B[round]){
			score_A += 3;
			team = 'A';
		}
		// B가 우승 시
		else if (A[round] < B[round]) {
			score_B += 3;
			team = 'B';
		}
		else if (A[round] == B[round]) {
			score_A += 1;
			score_B += 1;
		}
	}
	if (score_A == 10 && score_B == 10)
		team = 'D';
	
	if (score_A > score_B)
		printf("%d %d\nA",score_A,score_B);
	else if(score_A < score_B)
		printf("%d %d\nB",score_A,score_B);
	else if (score_A == score_B) {
		if (team == 'A') {
            printf("%d %d\nA",score_A,score_B);
			return 0;
		}
		else if (team == 'B') {
			printf("%d %d\nB",score_A,score_B);
			return 0;
		}
		else if (team == 'D') {
			printf("%d %d\nD",score_A,score_B);
			return 0;
		}
	}
}