SWEA (SW Expert Academy)/D3

[SWEA/D3] 4615 재미있는 오셀로 게임

hellosonic 2023. 5. 6. 13:49

문제 바로가기

 

SW Expert Academy

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

swexpertacademy.com

나의 코드 및 설명

t = int(input())

for test_case in range(1, t+1):
    n,m = map(int, input().split())
    #돌을 놓을 보드 설정
    board = [[0]*n for _ in range(n)]
    #초기에 놓여진 돌 정보들 저장
    board[n//2][n//2] = 2
    board[(n//2)-1][(n//2)-1] = 2
    board[(n//2)][(n//2)-1] = 1
    board[(n//2)-1][(n//2)] = 1
    #방향벡터
    dx = [0,1,0,-1,1,1,-1,-1]
    dy = [-1,0,1,0,-1,1,1,-1]
    #m번만큼 돌을 놓는다
    for _ in range(m):
        x,y,color = map(int, input().split()) 
        board[y-1][x-1] = color #(x-1, y-1)에 돌을 둔다
        #동서남북 & 대각선 방향 확인
        for i in range(8):
            r = []
            #한번 정한 방향에 대해서는 끝까지 가봐야 함
            for j in range(1, n):
                nx = x-1 + j*dx[i]
                ny = y-1 + j*dy[i]
                #만약 다음 좌표가 범위 안에 있다면
                if 0<=nx<=n-1 and 0<=ny<=n-1:
                    #만약 다음 좌표에 아무 돌도 없다면
                    if board[ny][nx] == 0:
                        break #다음 방향 확인
                    #만약 현재 두었던 돌과 일치한다면
                    elif board[ny][nx] == color:
                        #다른 돌을 만났을때 r리스트에 저장했던 좌표를 꺼내서 
                        #현재돌과 일치하는 색상으로 바꿔준다.
                        while r:
                            a,b = r.pop()
                            board[b][a] = color
                        break #다음 방향 확인
                    #만약 현재 두었던 돌과 다르면 
                    else:
                        r.append((nx,ny)) #해당 좌표를 r 리스트에 저장한다
                else:
                    break
    bcnt, wcnt = 0, 0
    for i in board:
        bcnt += i.count(1)
        wcnt += i.count(2)

    print("#{} {} {}".format(test_case, bcnt, wcnt))

피드백

문제를 풀고 풀이 과정을 이해하는 데에 2시간 30분이 걸렸다. 풀면서 나한테 계속 화가났다. 처음엔 노가다로 풀려고 했는데 실패했다. 그 다음엔 DFS로 풀려고 했는데, 생각해보니 한가지 방향을 정하면 그 방향만 끝까지 분석해야 되기 때문에 또 실패했다. 결국 다른 사람의 풀이를 참고할 수 밖에 없었는데, 이것 역시 이해하는데에 꽤 오래걸렸다. 더군다나 x,y 좌표 표기하는 것을 실수하는 바람에 시간을 엄청 잡아먹었다. 실력이 많이 부족한 것을 깨달았다. 정말.. 화가났다 ㅠ