본문으로 바로가기

[풀이 - Introduction to Nim Game] : <Easy / 83.20%>

더보기
string nimGame(vector<int> pile)
{
    int result = 0;
    for(int i = 0; i < pile.size(); ++i)
        result ^= pile[i];
        
    if(result == 0)
        return "Second";
    else
        return "First";
}

# Charles L. Bouton 교수의 게임이론에 따르면 현재 상태가 '균형 상태'이면 다음 차례의 플레이어(First)는 패배한다.

# 각 pile의 수를 2의 거듭제곱으로 나타냈을 때 나타나는 수들이 쌍(pair)을 이룰 때 '균형 상태'라고 한다.

# '균형 상태'의 각 pile을 XOR 연산하여 0이 되면 '균형 상태'로 판단할 수 있다.


[풀이 - Misère Nim] : <Easy / 76.62%>

더보기
string misereNim(vector<int> s)
{
    int result = 0;
    int one = 1;
    for(int i = 0; i < s.size(); ++i)
    {
        result ^= s[i];
        one *= s[i];
    }
    
    if(one == 1)
    {
        if((s.size() % 2) == 1)
            return "Second";
        else
            return "First";
    }
    //
    if(result == 0)
        return "Second";
    else
        return "First";
}

# 마지막으로 stone을 옮기는 player가 지는 NimGame을 'MisereNim'이라고 한다.

# 'MisereNim'의 승리조건은 기존 NimGame 승리조건에

   [모든 pile의 stone이 '1'일 때 pile의 갯 수의 홀수 여부]를 추가

 


[풀이 - Nimble Game] : <Easy / 68.60%>

더보기
string nimbleGame(vector<int> s)
{
    int sum = 0;
    for(int i = 1; i < s.size(); ++i)
    {
        if((s[i] % 2) == 1)
            sum ^= i;
    }
    //
    if(sum == 0)
        return "Second";
    else
        return "First";
}

# coin의 개수가 짝수인 square는 결과에 영향을 주지 않는다

# square의 index가 NimGame의 pile과 동일한 의미를 갖는다