Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
동적 프로그래밍이란?
동적 프로그래밍(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개의 돌에 대한 승자를 효율적으로 결정할 수 있습니다.