렌주 룰 구현
Closed this issue · 2 comments
holenet commented
#2 에 따라 구현한다.
is_win
- 주어진 수로 게임이 끝나는지 검사하는 함수 (이미 validation했다는 가정 하)
- 각각의 방향에 대해, 주어진 수를 포함한 연속된 돌의 개수를 구한다.
count_succession
- 해당 수가
백
인 경우, 5개 이상이면true
아니면false
- 해당 수가
흑
인 경우, 딱 5개면true
아니면false
is_valid_move
- 수를 놓을 수 있는지 없는지 검사하는 함수
- 해당 수가
백
이면 →true
- 아니면, 해당 위치에 수를 놓았다고 가정
육목
이 생기면 →false
is_overline
- 아니면,
사
의 개수와열린 삼
의 개수를 계산count_four
,count_open_three
사
가 1개,열린 삼
이 1개이면 →true
사
와열린 삼
개수의 합이 2개 이상이면, →false
- 아니면, →
true
count_four
- 주어진 수가 포함된 사
의 개수를 반환하는 함수 (흑
에게만 유효)
- 방향이 같더라도
사
를 구성하는 돌의 셋이 다르면 각각 하나의사
로 계산한다.- ex)
... O OOO O ...
는 2개의사
로 계산한다.
- ex)
- 파라미터로 주어진 수를 포함하여 같은 방향의 돌 4개를 선택한다.
- 이때, 연속된 돌들은 모두 선택하거나, 모두 선택하지 않아야 한다.
- 각각의 셋에 대해, 수 하나를 더해
오목
이 될 수 있는 경우의 수를 반환한다.is_valid_move
가true
인 경우에 대해is_five_in_a_row
를 호출
count_open_three
- 주어진 수가 포함된 열린 삼
의 개수를 반환하는 함수 (흑
에게만 유효)
사
와는 다르게 같은 방향에서 두개 이상의열린 삼
이 생기는 경우는 존재하지 않는다.
- 파라미터로 주어진 수를 포함하여 같은 방향의 돌 3개를 선택한다.
- 이때, 연속된 돌들은 모두 선택하거나, 모두 선택하지 않아야 한다.
- 각각의 셋에 대해, 수 하나를 더해
열린 사
가 될 수 있는 경우의 수를 반환한다.is_valid_move
가true
인 경우에 대해is_open_four
를 호출
count_succession
- 주어진 방향에 대해, 주어진 수를 포함하여 연속된 돌의 개수를 반환하는 함수
- 주어진 수로부터 주어진 방향의 양쪽 끝으로 한칸씩 움직이며 같은 색깔의 수를 센다.
is_five_in_a_row
- 주어진 방향에 대해, 주어진 수를 포함하여 오목
이 되는지 검사하는 함수
- 주어진 방향에 대해, 연속된 돌의 개수가 5개면
true
아니면false
count_succession == 5
is_overline
- 주어진 방향에 대해, 주어진 수를 포함하여 육목
인지 검사하는 함수
- 주어진 방향에 대해, 연속된 돌의 개수가 6개 이상이면
true
아니면false
count_succession >= 6
is_open_four
- 주어진 방향에 대해, 주어진 수를 포함하여 열린 사
가 되는지 검사하는 함수
- 주어진 방향에 대하여, 수 하나를 더해
오목
이 될 수 있으면true
아니면false
is_valid_move
가true
인 경우에 대해is_five_in_a_row
를 호출
heatz123 commented
이대로만 하면 굉장히 깔끔할 것 같습니다!
수 하나를 더하는 것을 시뮬레이션 할 때 케이스를 나눠 계산량을 줄일 수도 있겠는데, 일단 exhaustive하게 하고 나중에 수정해도좋을 듯합니다.
holenet commented
재귀적 구현이 너무 오래걸립니다...
최적화를 해야합니다...
DFS로 구현했는데 BFS로 해야할 것 같습니다...