https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXaSUPYqPYMDFASQ
2중for문을 돌면서 o를 만나면, omok이라는 함수를 실행한다.
omok 함수를 연속된 돌이 5개 있는지를 확인하는 함수이다.
True이면, flg=1으로 만든 후,
모든 for문을 break해서 YES를 출력한다.
for testcase in range(1,T+1):
flg = 0
N = int(input())
arr = [list(input()) for _ in range(N)]
for i in range(N):
for j in range(N):
if arr[i][j] == 'o':
if omok(i,j)==True:
flg = 1
break
if flg == 1:
break
오목 돌을 확인할때, 이론상으로는 8방향 (상하좌우, 대각선상하좌우) 를 다이렉트배열로 돌면되지만,
사실 위, 대각선 오른쪽 위, 대각선 왼쪽 위, 그리고 왼쪽은 이미 for문을 돌면서 확인했기 때문에
굳이 다이렉트배열에 추가 안해도된다.
def omok(y, x):
dy = [1, 0, 1, 1]
dx = [0, 1, -1, 1]
for i in range(4):
cnt = 1
j = 1
while True:
ny = y + dy[i]*j
nx = x + dx[i]*j
if nx < 0 or ny < 0 or nx > N - 1 or ny > N - 1 or arr[ny][nx] == '.':
break
if arr[ny][nx] == 'o':
cnt += 1
j += 1
if cnt >= 5:
return True
return False
전체 코드)
def omok(y, x):
dy = [1, 0, 1, 1]
dx = [0, 1, -1, 1]
for i in range(4):
cnt = 1
j = 1
while True:
ny = y + dy[i]*j
nx = x + dx[i]*j
if nx < 0 or ny < 0 or nx > N - 1 or ny > N - 1 or arr[ny][nx] == '.':
break
if arr[ny][nx] == 'o':
cnt += 1
j += 1
if cnt >= 5:
return True
return False
T = int(input())
for testcase in range(1,T+1):
flg = 0
N = int(input())
arr = [list(input()) for _ in range(N)]
for i in range(N):
for j in range(N):
if arr[i][j] == 'o':
if omok(i,j)==True:
flg = 1
break
if flg == 1:
break
if flg:
print(f'#{testcase} YES')
else:
print(f'#{testcase} NO')
'파이썬 알고리즘' 카테고리의 다른 글
[파이썬] 백준 1475번 방 번호 (0) | 2022.10.31 |
---|---|
[파이썬] 백준 6603 로또 (0) | 2022.10.31 |
[파이썬] 백준 7113 Rectangle (while문) (0) | 2022.10.25 |
[파이썬] 백준 7113 Rectangle (0) | 2022.10.25 |
[파이썬] SWEA 3499 퍼펙트 셔플 (0) | 2022.10.25 |