알고리즘/SW Expert Academy
SWEA 11315. 오목판정 [D3] - Python
pogles
2023. 1. 18. 17:15
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개를 찾은 이후 나머지 전체를 탐색할 필요가 없어진다.
즉, 함수를 통해 효율적으로 알고리즘을 구현할 수 있다.