ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2615 오목
    코테 대비 python/백준 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)

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

    '코테 대비 python > 백준' 카테고리의 다른 글

    15657 n과 m (8)  (0) 2023.05.03
    [복습] 15649 n과 m 1  (1) 2023.04.17
    [복습] 14502 연구소  (0) 2023.04.17
    18115 카드 놓기  (0) 2023.04.16
    2580 스도쿠  (0) 2023.04.14
Designed by Tistory.