알고리즘/it 취업을 위한 알고리즘 문제풀이

21. 카드게임

고줭 2021. 5. 17. 16:58

문제

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
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
A B B D A A B D D D

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

입력설명

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

출력설명

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

입력예제

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

출력예제

16 13
A


#include <stdio.h>

int main(){
	//freopen("input.txt", "rt", stdin);
	int i, a[10], b[10], a_count=0, b_count=0, last_winner=0;
	
	for(i=0; i<10; i++){
		scanf("%d", &a[i]);
	}
	for(i=0; i<10; i++){
		scanf("%d", &b[i]);
	}
	
	for(i=0; i<10; i++){
		if(a[i] == b[i]){
			a_count++;
			b_count++;
		} else if(a[i] > b[i]){
			a_count += 3;
			last_winner = 1;
		} else{
			b_count += 3;
			last_winner = 2;
		}
	}
	printf("%d %d\n", a_count, b_count);
	if(a_count == b_count){
		if(last_winner == 1){
			printf("A");
		} else if(last_winner == 2){
			printf("B");
		} else {
			printf("D");
		}
	} else if(a_count > b_count){
		printf("A");
	} else if(a_count < b_count){
		printf("B");
	} 
	
	
	return 0;
}

문제가 깁니다. 전 글이 길면 도망치는 습성이 있는데 이제는 피할수없습니다 취업해야죠

문제를 간단히 요약해보면 1~9까지 숫자가 주어지고 각자 받은 순서대로 오픈해서 숫자가 높으면  이긴 사람의 점수가 +3 비기면 둘 다 +1 입니다.
그래서 A와 B의 승점을 출력하고 줄바꿔서 승점이 높은사람을 출력하면 되겠네요.

그치만 두번째 표같이 승점이 같은경우 결국 마지막에 이긴사람을 출력해야합니다. 여기서도 문제가 또 있는데 그것은 첨부터 끝까지 비긴경우입니다. 그냥 D를 출력하면 됩니다.
거의 불가능한 경우지만 우주도 우연에의해 시작됐다는데 이정도 확률쯤이야

'알고리즘 > it 취업을 위한 알고리즘 문제풀이' 카테고리의 다른 글

23. 연속 부분 증가수열  (0) 2021.05.18
22. 온도의 최대값  (0) 2021.05.18
20. 안내면 진거~ 가위바위보!  (0) 2021.05.17
19. 분노 유발자  (0) 2021.05.17
18. 층간소음  (0) 2021.05.17