세 명을 위한 카드 게임

문제 설명

앨리스, 밥, 찰리가 카드 게임을 하고 있습니다. 각 플레이어는 각각 카드 더미를 가지고 있으며, 각 카드에는 문자 a, b, c 중 하나가 적혀 있습니다. 각 더미에 있는 카드의 순서는 변경할 수 없습니다.

플레이어들은 번갈아가며 턴을 진행합니다. 앨리스가 먼저 시작합니다.

현재 턴인 플레이어의 더미에 카드가 하나 이상 있으면, 가장 위에 있는 카드를 버립니다. 버린 카드에 적힌 문자로 시작하는 이름을 가진 플레이어가 다음 턴을 가집니다. (예를 들어, 카드가 'a'이면 앨리스가 다음 턴을 진행합니다.)

현재 턴인 플레이어의 더미가 비어 있으면 게임이 종료되고, 해당 플레이어가 게임에서 승리합니다.

플레이어들의 초기 더미가 주어집니다. Specifically, 세 개의 문자열 SA, SB, SC가 주어지며, SA의 i번째 문자는 앨리스 초기 더미의 i번째 카드에 적힌 문자입니다. SB와 SC는 각각 밥과 찰리의 초기 더미를 동일한 방식으로 나타냅니다.

게임의 승자를 결정하세요.

제약 조건

  • 1 ≤ |SA| ≤ 100
  • 1 ≤ |SB| ≤ 100
  • 1 ≤ |SC| ≤ 100
  • SA, SB, SC의 각 문자는 a, b, 또는 c입니다.

입력 형식

입력은 표준 입력에서 다음 형식으로 주어집니다:

SA
SB
SC

출력 형식

앨리스가 승리하면 A를 출력합니다. 밥이 승리하면 B를 출력합니다. 찰리가 승리하면 C를 출력합니다.

예제 입력

aca
accc
ca

예제 출력

A

문제 풀이

이 게임을 시뮬레이션하여 해결할 수 있습니다. 각 플레이어의 현재 턴 번호와 각 더미에서 사용한 카드 수를 추적하면 됩니다.

앨리스, 밥, 찰리는 각각 번호 1, 2, 3으로 표현할 수 있습니다. 현재 플레이어 번호를 나타내는 변수를 시작 값 1로 초기화합니다. 각 플레이어가 카드를 사용할 때마다 해당 플레이어의 인덱스를 증가시키고, 버린 카드에 따라 다음 플레이어 번호를 결정합니다.

어떤 플레이어의 인덱스가 해당 플레이어의 문자열 길이와 같아지면(즉, 모든 카드를 사용했으면), 그 플레이어가 승리합니다.

참고 코드 (C++)

#include 
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    string deck[3];
    cin >> deck[0] >> deck[1] >> deck[2];
    
    int currentIdx[3] = {0, 0, 0};
    int playerTurn = 0;
    
    while (true) {
        if (currentIdx[playerTurn] >= (int)deck[playerTurn].size()) {
            cout << (char)('A' + playerTurn) << '\n';
            break;
        }
        
        char card = deck[playerTurn][currentIdx[playerTurn]];
        currentIdx[playerTurn]++;
        playerTurn = card - 'a';
    }
    
    return 0;
}

위 코드에서 deck 배열은 세 플레이어의 카드 더미를 저장합니다. currentIdx 배열은 각 플레이어가 현재까지 사용한 카드 수를 추적합니다. playerTurn 변수는 현재 턴인 플레이어를 나타냅니다(0=앨리스, 1=밥, 2=찰리).

게임 루프에서 현재 플레이어의 더미가 비어 있으면 해당 플레이어를 출력하고 종료합니다. 그렇지 않으면 현재 플레이어의 맨 위 카드를 확인하고, 해당卡的 문자에 따라 다음 턴의 플레이어를 결정합니다.

태그: algorithm Simulation cpp card-game

7월 5일 20:40에 게시됨