Daily Pogle

SWEA 11315. 오목판정 [D3] - Python 본문

알고리즘/SW Expert Academy

SWEA 11315. 오목판정 [D3] - Python

pogles 2023. 1. 18. 17:15

SW Expert Academy

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


문제는 의미 그대로 오목이 완성되었느냐 판정하는 알고리즘이다.

 

이 문제를 푸는데 글을 잘 읽어야한다. 이 알고리즘을 구현하는데 자신이 실수한 부분을 먼저 적겠다.

 

 

  • 이 알고리즘은 빙고가 아니다! 오목이다. 한줄 전체가 o 가 아니라 o 가 연속으로 5개 이상이면 된다.
  • 배열 인덱스를 잘 생각하면서 짜야한다.

 


 

문제풀이

 

실제 오목을 하기 위한 바둑판을 생각해보자

(오목을 두는 위치는 십자(+) 가 아니라 사각(ㅁ) 이다.)

 

오목이 완성되기 위해서는 한 방향에서 5개 연속 o 이 있으면 된다.

현 위치가 o 이면 한 뱡향에서 다음 4개 칸도 o 이면 된다.

 

 

  • 방향을 사용하므로 drow, dcol 을 활용한다. (상하좌우 대각선 방향전환)
  • 범위를 설정한다 ( 현재 위치 ~ 다음 4번째 위치까지 )
  • 함수를 사용하여 오목 찾은 이후에 현재 게임을 멈추고 다음게임으로 넘어가게 한다. (중첩 반복문으로 구현시 현재 게임을 중단하는데 있어서 복잡해짐)

 

# 기본 제공코드는 임의 수정해도 관계 없습니다. 단, 입출력 포맷 주의
def check_omok(row_position, col_position):
    for direct in range(6):  # 6방향 확인
        omok = 0 # 연속
        if ((0 <= row_position + 4 * drow[direct] < board_size) and (
                0 <= col_position + 4 * dcol[direct] < board_size)):  # 연속된 자리 5가 범위안에 있을때
            for mul in range(5): # 현재에서 +n 번째 위치 탐색
                row = row_position + mul * drow[direct]
                col = col_position + mul * dcol[direct]
                if board[row][col] == "o":
                    omok += 1
            if omok == 5: # 연속 5개 o 가 있다면면                return True
    return False

def board_move(board, board_size):
    for row in range(board_size):  # 시작점으로부터 시작
        for col in range(board_size):
            print(board[row][col])
            if (board[row][col] == "o"): # 현 위치가 o 이면 오목체크
                if check_omok(row, col):
                    print(f'#{test_case} {yes}')
                    return
    print(f'#{test_case} {no}')
    return


T = int(input())
yes = "YES"
no = "NO"
drow = [0, 1, 0, -1, 1, 1]  # 동, 남, 서, 북, 남동, 남서
dcol = [1, 0, -1, 0, 1, -1]
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    board_size = int(input())
    board = [input() for i in range(board_size)]
    board_move(board,board_size)

*****

함수를 사용하여 오목을 찾으면 현재 오목판 게임을 중지하고 다음 오목판 게임으로 넘어갈 수 있다.

오목 1개를 찾은 이후 나머지 전체를 탐색할 필요가 없어진다.

 

즉, 함수를 통해 효율적으로 알고리즘을 구현할 수 있다.