20200731 // 삼성 SW Expert 아카데미 문제 // 4615

2020. 7. 31. 12:45카테고리 없음

삼성 SW Expert 아카데미 4615번 "재미있는 오셀로 게임" 문제입니다.

TC = int(input())     
for tc in range(1, TC + 1):
    N, M = map(int, input().split())
    board = [[0]*N for _ in range(N)]
    # 백 = 2, 흑 = 1
    board[N//2-1][N//2-1] = 2
    board[N//2-1][N//2] = 1
    board[N//2][N//2-1] = 1
    board[N//2][N//2] = 2

    for i in range(M):
        X, Y, S = map(int, input().split())
        board[Y-1][X-1] = S
        
        direc = 0
        while direc < 8:
            posX, posY = X - 1, Y - 1
            lst = []
            #위쪽 검사
            if direc == 0:
                if posY == 0:
                    direc += 1
                    continue
                else:
                    while board[posY-1][posX] != S:
                        posY -= 1
                        if board[posY][posX] == 0:
                            lst.clear()
                            break
                        lst.append([posX, posY])
                        if posY == 0:
                            lst.clear()
                            break
                    for e in lst:
                        board[e[1]][e[0]] = S
                    direc += 1
            # 위오른쪽
            elif direc == 1:
                if posY == 0 or posX == N-1:
                    direc += 1
                    continue
                else:
                    while board[posY-1][posX+1] != S:
                        posY, posX = posY - 1, posX + 1
                        if board[posY][posX] == 0:
                            lst.clear()
                            break
                        lst.append([posX, posY])
                        if posY == 0 or posX == N-1:
                            lst.clear()
                            break
                    for e in lst:
                        board[e[1]][e[0]] = S
                    direc += 1
            # 오른쪽
            elif direc == 2:
                if posX == N-1:
                    direc += 1
                    continue
                else:
                    while board[posY][posX+1] != S:
                        posX += 1
                        if board[posY][posX] == 0:
                            lst.clear()
                            break
                        lst.append([posX, posY])
                        if posX == N-1:
                            lst.clear()
                            break
                    for e in lst:
                        board[e[1]][e[0]] = S
                    direc += 1
            #아래오른쪽
            elif direc == 3:
                if posY == N-1 or posX == N-1:
                    direc += 1
                    continue
                else:
                    while board[posY+1][posX+1] != S:
                        posY, posX = posY + 1, posX + 1
                        if board[posY][posX] == 0:
                            lst.clear()
                            break
                        lst.append([posX, posY])
                        if posY == N-1 or posX == N-1:
                            lst.clear()
                            break
                    for e in lst:
                        board[e[1]][e[0]] = S
                    direc += 1
            # 아래쪽
            elif direc ==4:
                if posY == N-1:
                    direc += 1
                    continue
                else:
                    while board[posY+1][posX] != S:
                        posY+= 1
                        if board[posY][posX] == 0:
                            lst.clear()
                            break
                        lst.append([posX, posY])
                        if posY == N-1:
                            lst.clear()
                            break
                    for e in lst:
                        board[e[1]][e[0]] = S
                    direc += 1
            #아래왼쪽
            elif direc == 5:
                if posY == N-1 or posX == 0:
                    direc += 1
                    continue
                else:
                    while board[posY+1][posX-1] != S:
                        posY, posX = posY + 1, posX - 1
                        if board[posY][posX] == 0:
                            lst.clear()
                            break
                        lst.append([posX, posY])
                        if posY == N-1 or posX == 0:
                            lst.clear()
                            break
                    for e in lst:
                        board[e[1]][e[0]] = S
                    direc += 1
            #왼쪽
            elif direc == 6:
                if posX == 0:
                    direc += 1
                    continue
                else:
                    while board[posY][posX-1] != S:
                        posX -= 1
                        if board[posY][posX] == 0:
                            lst.clear()
                            break
                        lst.append([posX, posY])
                        if posX == 0:
                            lst.clear()
                            break
                    for e in lst:
                        board[e[1]][e[0]] = S
                    direc += 1
            #위왼쪽
            elif direc == 7:
                if posY == 0 or posX == 0:
                    direc += 1
                    continue
                else:
                    while board[posY-1][posX-1] != S:
                        posY, posX = posY - 1, posX - 1
                        if board[posY][posX] == 0:
                            lst.clear()
                            break
                        lst.append([posX, posY])
                        if posY == 0 or posX == 0:
                            lst.clear()
                            break
                    for e in lst:
                        board[e[1]][e[0]] = S
                    direc += 1
    black, white = 0, 0
    for e in board:
        black += e.count(1)
        white += e.count(2)
    print("#%s"%tc, black, white)

 

돌을 놓는 곳 주변에 8방향 탐색을 해서 방향마다 흑백돌에 따라 같은 돌이 나올때까지 지나온 위치를 저장하며 간다.

 

그러다 같은색의 돌을 만나면 지나온 반대색의 돌을 같은색으로 바꾸고 같은돌을 만나기 전에 0을 만나면 탐색 및 변경

 

을 중단하고 방향을 바꾼다.