Programming

[BOJ 24553] 팰린드롬 게임

minigb 2024. 1. 17. 00:23

https://www.acmicpc.net/problem/24553

 

24553번: 팰린드롬 게임

각 게임에서 상윤이가 이긴다면 0, 승우가 이긴다면 1을 출력한다.

www.acmicpc.net

 

오늘 (24년 1월 16일) 영어 스터디에서 풀었던 문제

 

게임이론은 늘 어렵다. 그래서 optimal 한 게 뭔데?

 

처음 나온 솔루션은 dp 테이블을 만들어서 dp[n][k] (k = 0, 1)을 돌이 n개 남았을 때 k가 이길 수 있는지를 binary 하게 저장하는 거였다.

그리고 이건 모든 dp[n - (palindrome smaller than n)][!k]를 and operation으로 연산한 것으로 결정된다.

 

원래는 ‘음 그렇지 그렇게 할 수 있을 거 같아. 시간 복잡도는 얼마지?’를 물어보고

‘근데 조금 더 optimal한 솔루션이 있지 않을까?’ 이렇게 진행했었는데,

최근에는 방식을 바꿔서 하나의 솔루션이 나오면 그걸로 일단 한 번 코드를 짜보기로 했다.

 

그래서 코드를 짜기 시작했는데

n보다 작은 모든 palindrome을 구하다가 끝났다. ㅋㅋㅋ

이때 이야기한 방식이 맞는지 아직 검증이 안 됐다. 나중에 확인해봐야겠음.

 

그리고 끝나고 나서 한국어로 마무리 하는 시간에 풀이를 들었다.

1) 1-digit number는 항상 palindrome이다 -> 1~9개가 남는 상태가 되면 그때는 모두 가져갈 수 있어서 게임에서 이긴다.

2) 0으로 끝나는 palindrome은 없다 -> 10의 배수개만큼 남으면 절대로 그것을 한 번에 다 가져감으로써 이기는 방법이 없다.

 

따라서 처음으로 10의 배수개만큼 남기는 사람이 이긴다.

그러므로 주어진 n이 10의 배수가 아니면 이길 수 있다.

 

int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int tc; cin >> tc;
    while (tc--) {
        ll n; cin >> n;
        cout << (int)(!(n % 10)) << kEndl;
    }
    
}

 

키야… 한 줄로 풀림

 

아 아무튼 n 이하의 모든 palindrome을 구하는 방법을 논한 것도 재밌었다. ㅎㅅㅎ

 

 

 

 

 

 

https://blog.naver.com/mini_gb/223324723041

 

[BOJ 24553] 팰린드롬 게임

https://www.acmicpc.net/problem/24553 오늘 (24년 1월 16일) 영어 스터디에서 풀었던 문제 게임이론은 늘...

blog.naver.com