파이썬 알고리즘

[파이썬] SWEA 11315 오목판정

뜻 지, 깨달음 오 2022. 10. 25. 17:30

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXaSUPYqPYMDFASQ 

 

SW Expert Academy

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

swexpertacademy.com

 

 

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')