포스트

[2024 동계 모각코] 1주차 계획

1주차 계획

개요

1주차(1. 2~ 1. 7)의 계획입니다.

  • 9장 DP 활용
    • 조합 게임
      • 문제: TICTACTOE
      • 문제: NUMBERGAME
      • 문제: BLOCKGAME
    • 반복적 동적 계획법
      • 문제: SUSHI
      • 문제: GENIUS

조합 게임

문제: TICTACTOE

틱택토를 DP를 이용해서 기보가 주어졌을 때 누가 이기는지, 무승부인지 판별합니다.

Top-down 알고리즘으로 작성했습니다.

문제는 여기에

코드는 여기에 있습니다!

더 개선 가능한 부분으로는, 게임판을 좌우, 상하, 대각선으로 뒤집기, 90도 회전을 해도 승패는 동일하니 이를 이용해 프로그램을 빨리 만들 수 있다는 것입니다.

틱택토에는 의미가 없을 수 있으나 체스의 엔드게임 분석 알고리즘을 만들 때 유용한 테크닉입니다.

문제: NUMBERGAME

게임에서 플레이어 1이 플레이어 2와 차이를 낼 수 있는 숫자의 최대 합을 구하는 문제입니다.

이것 또한 Top-down 알고리즘으로 작성해서, int 포인터 두 개와 플레이어 1, 2 턴을 나타내는 bool 파라미터를 이용하여 DP를 적용한 재귀 함수를 선언했습니다.

이 문제는 작은 미니맥스 알고리즘입니다.

문제는 여기에

코드는 여기에 있습니다!

문제: BLOCKGAME

블록 배치도가 주어지면, 블록을 놓을 수 없으면 패배하는 게임입니다. 반대로 상대를 블록을 놓을 수 없게 하면 승리하는 게임입니다.

알고리즘의 구현은 잘 했으나, int[1 << 25]가 엄청나게 큰 숫자여서 런타임 에러가 발생했습니다. int[1 << 25]가 아닌 char[1 << 25]bitmask를 구현해야 했습니다.

문제는 여기에

코드는 여기에 있습니다!


반복적 동적 계획법

문제: SUSHI

공간 복잡도를 낮추기 위해 슬라이딩 윈도 기법을 활용하여 반복적 동적 계획법을 사용하는 문제입니다.

다이나믹 프로그래밍과 그리디 알고리즘을 섞어 쓸 수 있습니다!

포스트는 여기에 있습니다.

문제: GENIUS

Dynamic programming과 행렬 거듭제곱과 응용을 통해 푸는 문제입니다.

포스트는 여기에 있습니다.


돌아보며

어려웠던 문제

이번 주차는 그리 어려운 문제가 없었던 것 같습니다. 전 주차에 했던 내용들은 엄청나게 어려웠습니다만..

9장 DP활용 파트를 돌아봤을 때, 가장 어려웠던 문제는 KLIS였습니다.

문제: KLIS에 대한 포스트는 여기에 있습니다.

풀 때는 $O(n^2)$시간이 걸리는 반복적 동적 계획법으로 풀었으나, $O(n \times \log n)$시간 알고리즘이 또 있더라고요, 시간이 나면 풀어 볼 예정입니다.

Dynamic programming 정리

동적 계획법을 보통 DP + 재귀함수로 구현하나. 반복문 + DP table으로도 구현이 가능합니다.

반복문 + DP table의 조합으로 구현하는 것을 반복적 동적 계획법이라 합니다.

Subproblem 간의 의존성이 명확한 경우에 반복적 동적 계획법이 유리한 편이며

상황에 따라 두 가지 방법을 선택해서 구현하면 좋을 것 같습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.