[백준 9658][C++] 돌 게임 4

2023. 8. 9. 15:41·코딩 공부/백준(C++)

문제 링크

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


 

◆문제 해결 및 설명◆

문제 : 턴을 번갈아가며 돌을 1 or 3 or 4개를 뺄 수 있고, 받은 돌의 갯수가 1이면 질 때, 최선의 플레이를 하였을 경우 이기는 사람을 구하여라

 

일단 나열을 해보았다. (먼저 받은 아이가 상근)

  1. 상근 패
  2. 상근 승(1,1)
  3. 상근 패(1,1,1)
  4. 상근 승(3,1)
  5. 상근 승(4,1)
  6. 상근 승(3,1,1,1)
  7. 상근 승(4,1,1,1)
  8. 상근 ?(7,6,? // 7,4,? // 7,3,?) = 창영 승

7전까지는 3을 받는것이 아니라면 상근이가 무조건 이긴다. (최선의 플레이 상황 가로에 나열)

하지만 8부터는 애매 모호해지는데 다음 턴인 창영이가 플레이하기 때문에 6, 4, 3을 받으면 창영이가 이기게 된다.

여기서 알 수 있는것은 턴이 넘어가게 된다면 상근이의 승리였던 숫자들이 창영이가 승리할 수 있는 플랜이 된다.

 

따라서 이름을 바꿔보자. (상근 -> 받는 사람의 )

  1. 받는 사람의 패
  2. 받는 사람의 승(1,1)
  3. 받는 사람의 패(1,1,1)
  4. 받는 사람의 승(3,1)
  5. 받는 사람의 승(4,1)
  6. 받는 사람의 승(3,1,1,1)
  7. 받는 사람의 승(4,1,1,1)
  8. 받는 사람의 패(7,6,3,1,1,1 // 7,4,3,1 // 7,3,1,1,1)

이 떄  가져갈 수 있는 돌의 개수는 한정되어 있으므로 Bottom-up 방식으로 코드를 짤 수 있다. 

최선의 플레이는 받는사람이 절대 승리하는 숫자를 주면 안되는 것이므로
N  = !(N-1=win && N-3=-win && N-4=-win)
을 통해 넘겨줄 경우의 수가 전부 승리일 때 패배로 코드를 작성하였다.

 

◆코드 전문◆

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
    int N;
    cin >> N;
    vector<int> dp(N + 1, 1);
    dp[1] = 0;
    dp[2] = 1;
    dp[3] = 0;
    dp[4] = 1;
    for (int i = 5; i <= N; i++)
    {
        if (dp[i - 1] == 1 && (dp[i - 3] == 1 && 0 < i - 3) && (dp[i - 4] == 1 && 0 < i - 4))
        {
            dp[i] = 0;
        }
    }

    if (dp[N])
    {
        cout << "SK";
    }
    else
    {
        cout << "CY";
    }
}

'코딩 공부 > 백준(C++)' 카테고리의 다른 글

[백준 2607][C++] 비슷한 단어  (0) 2023.08.11
[백준 15686][C++] 치킨 배달  (0) 2023.08.09
[백준 16974][C++] 레벨 햄버거  (0) 2023.08.07
[백준 2941][C++] 크로아티아 알파벳, segfault, size_t  (0) 2023.07.22
[백준] 11659번 : 구간 합 구하기 4 [C++]  (0) 2023.02.04
'코딩 공부/백준(C++)' 카테고리의 다른 글
  • [백준 2607][C++] 비슷한 단어
  • [백준 15686][C++] 치킨 배달
  • [백준 16974][C++] 레벨 햄버거
  • [백준 2941][C++] 크로아티아 알파벳, segfault, size_t
메카인
메카인
  • 메카인
    메카인의 지식창고
    메카인
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩 공부
        • TIL(Today I Learn)
        • TIL
        • 백준(C++)
        • Python
        • 알고리즘
        • 프로젝트 회고
      • C++
        • C++
        • C++ STL
        • C,C++ mCoding yotube
      • 게임개발
        • 언데드서바이벌_골드메탈_클론코딩
        • 3D_골드메탈_클론코딩
        • 유니티_문제해결
        • 게임 수학
      • Unreal 공부
        • UE5 GameDev
        • Unreal Engine 4 C++ The Ult..
      • 교재 문제 풀이
        • 운영체제
      • 정보처리기사
        • 정처기 요약
        • 정처기 오답노트
      • 학교수업
        • 데이터베이스
        • 프로그래밍 언어론
        • 리눅스 시스템
        • 네트워크
      • 일상
        • 주식
        • 독서
      • (비공개 전용)
        • memory
        • Build
        • OOP
        • Smart Pointer
        • lamda
        • 게임 수학
        • 모던 C++
        • 모던 C++ STL
        • 모던 C++ Concurrency, Paralle..
        • 책
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 블로그 관리
  • 링크

  • 공지사항

    • 공지사항 - 인생과 블로그의 목표
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
메카인
[백준 9658][C++] 돌 게임 4
상단으로

티스토리툴바