코테 대비 python/백준

백준 2615 오목

ylab 2023. 4. 21. 16:28

https://www.acmicpc.net/problem/2615

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

##다섯알을 먼저 놓으면 이김 그러나 6알은 안댐
#검은색이 이겼을 경우1 흰색 2 승부가 결정 안났으면 0
#무식하게 다찾으면 된다 단 가로 세로 대각선(우하, 좌하)
#어짜피 출력하는건 맨처음 좌표값이므로 2중 포문으로 구현
from collections import deque
#우선 입력 받자
graph = [list(map(int,input().split())) for _ in range(19)]
black=[]
white=[]
#print(graph)
for i in range(19):
    for j in range(19):
        if graph[i][j] ==1:
            black.append((i,j))
        elif graph[i][j] ==2:
            white.append((i,j))
#상하좌우 오른쪽아래, 왼쪽아래, 오른쪽위, 왼쪽위
dx=[-1,1,0,0]
dy=[0,0,-1,1]
#만약 bfs로 확인하면?? 6목은 제거 확인
flag=0


def check(x,y,num):
    check_row(x,y,num)
    check_col(x,y,num)
    check_rightdown(x,y,num)
    check_leftdown(x,y,num)

    return
def check_row(x,y,num):
    global flag
    cnt=1
    q=deque()
    q.append((x,y))
    for i in range(5):
        a,b=q.popleft()
        nx=a+dx[3]
        ny=b+dy[3]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            cnt+=1
            q.append((nx,ny))
        else:
            break
    ##육목확인
    if cnt==5:
        nx=x+dx[2]
        ny=y+dy[2]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            return
        nx=a+dx[3]
        ny=b+dy[3]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            return
        flag=1
    return
def check_col(x,y,num):
    global flag
    cnt=1
    q=deque()
    q.append((x,y))
    for i in range(5):
        a,b=q.popleft()
        nx=a+dx[1]
        ny=b+dy[1]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            cnt+=1
            q.append((nx,ny))
        else:
            break
    ##육목확인
    if cnt==5:
        nx=x+dx[0]
        ny=y+dy[0]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            return
        nx=a+dx[1]
        ny=b+dy[1]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            return
        flag=1
    return

def check_rightdown(x,y,num):
    global flag
    cnt=1
    q=deque()
    q.append((x,y))
    for i in range(5):
        a,b=q.popleft()
        nx=a+dx[1]
        ny=b+dy[3]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            cnt+=1
            q.append((nx,ny))
        else:
            break
    ##육목확인
    if cnt==5:
        nx=x+dx[0]
        ny=y+dy[2]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            return
        nx=a+dx[1]
        ny=b+dy[3]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            return
        flag=1
    return

def check_leftdown(x,y,num):
    global flag
    cnt=1
    q=deque()
    q.append((x,y))
    for i in range(5):
        a,b=q.popleft()
        nx=a+dx[1]
        ny=b+dy[2]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            cnt+=1
            q.append((nx,ny))
        else:
            break
    ##육목확인
    if cnt==5:
        nx=x+dx[0]
        ny=y+dy[3]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            return
        nx=a+dx[1]
        ny=b+dy[2]
        if 0<=nx<19 and 0<=ny<19 and graph[nx][ny]==num:
            return
        flag=2
        #x,y=a,b
        #print(x,y)
    return a,b


for i in black:
    x,y=i
    check(x,y,1)
    if flag==1:
        print(1)
        print(x+1,y+1)
        exit(0)
    elif flag==2:
        print(1)
        print(x+5,y-3)
        exit(0)
for i in white:
    x,y=i
    check(x,y,2)
    if flag==1:
        print(2)
        print(x+1,y+1)
        exit(0)
    elif flag==2:
        print(2)
        print(x+5,y-3)
        exit(0)

if flag==0:
    print(0)

나만 코드 긴거같아 ㅜㅜ ㅋㅋ