일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- ReactMediaRecorder
- js canvas
- SWEA 1228 python
- 탭 활용해 내용바꾸기
- MySQL
- $.ajax 사용
- request property
- scroll 맨 밑
- Git
- CSS
- dispatcherservlet 오류
- java
- js session
- MySQL update delete
- Canvas
- SWEA 1954 java
- javascript
- sw8931
- 페이지 내 탭
- jQuery EventListener
- scanner bufferedreader
- web recorder
- SWEA 6190 python
- js 객체생성
- response property
- js XML 읽기
- GitHub
- SWEA 11315 python
- tabs switch
- scroll 맨 밑 이동
Archives
- Today
- Total
Daily Pogle
SWEA 11315. 오목판정 [D3] - Python 본문
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개를 찾은 이후 나머지 전체를 탐색할 필요가 없어진다.
즉, 함수를 통해 효율적으로 알고리즘을 구현할 수 있다.
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
SWEA 1228. 암호문1 - Python (0) | 2023.01.20 |
---|---|
SWEA 6190. 정곤이의 단조증가하는 수 [D3] - python (0) | 2023.01.18 |
SWEA 8931. 제로 [D3] - Stack (0) | 2023.01.16 |
SWEA 1954. 달팽이 숫자 [D2] - java (0) | 2023.01.13 |