Skip to content

BOJ2644_돌_게임_실버5_조재은 #38

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

Conversation

jojaegu2
Copy link
Collaborator

동적 프로그래밍이란?
동적 프로그래밍(Dynamic Programming, DP)은 복잡한 문제를 여러 개의 간단한 하위 문제로 나누어 해결하는 방법입니다. 각 하위 문제의 해결 결과를 저장해두었다가, 같은 하위 문제가 다시 등장할 때 그 결과를 재사용함으로써 전체 문제의 해결 속도를 높입니다. 이 과정에서 메모이제이션(Memoization)이라고 불리는 기법이 종종 사용되며, 이는 하위 문제의 해결 결과를 저장하는 방법이다.

주어진 돌 게임 코드는 두 플레이어(SK와 CY)가 번갈아 가며 돌을 가져가는 게임입니다.
게임의 규칙은 각 플레이어가 1개, 2개, 또는 3개의 돌을 선택적으로 가져갈 수 있으며,
마지막 돌을 가져가는 플레이어가 승리한다는 것입니다.

코드는 동적 프로그래밍을 사용하여 주어진 돌의 개수에 대해 승자를 결정합니다.

변수 초기화:
n: 전체 돌의 개수.
win: 길이가 10001인 리스트. 각 인덱스의 값은 해당 돌의 개수일 때 승자를 나타냅니다.
1은 SK가 이기는 경우, 0은 CY가 이기는 경우를 나타냅니다.
-1은 아직 결정되지 않았음을 의미합니다.

기본 경우 설정:
돌의 개수가 1개일 때(win[1]), 3개일 때(win[3])는 SK가 승리합니다.
돌의 개수가 2개일 때(win[2])는 CY가 승리합니다.

for 루프 로직:
돌의 개수가 4개부터 n개까지의 각 경우에 대해 승자를 결정합니다.
if win[i-1] == 1 or win[i-4] == 1: 조건에서, 현재 돌의 개수에서 1개 또는 4개를 제거했을 때 SK가 이긴 경우(CY의 차례에서 선택할 수 있는 최적의 수), 현재 돌의 개수(i)에서는 CY가 이깁니다.

그렇지 않으면, SK가 승리합니다.

결과 출력:
win[n]의 값에 따라 승자를 출력합니다. 1이면 "SK", 0이면 "CY"를 출력합니다.
코드의 for 루프는 동적 프로그래밍의 전형적인 형태를 보여줍니다.
각 단계에서, 이전 단계의 결과를 사용하여 현재 단계의 결과를 계산하고, 이를 win 리스트에 저장합니다.
이 과정을 통해, 마지막 단계인 n개의 돌에 대한 승자를 효율적으로 결정할 수 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant