본문 바로가기

Algorithm/SWEA

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

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

 

SW Expert Academy

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

swexpertacademy.com

 

 

1. 해결방법

쉬웠다면 쉽고 조금 어려웠다면 조금 어렵다. 말 그대로 아이디어만 떠오르면 쉽게 풀 수 있는 문제다. 다른 풀이 아이디어의 도움을 받아서 나머지는 알아서 코드를 작성했다. 디버깅 포함 2시간 걸림;

1. 기본적으로 오셀로판을 초기세팅으로 맞추어 놓아야 한다.
2. 1번과 2번 유저가 번갈아가면서 인덱스 위치를 입력받으면 for문을 돌아서 8방향 전부 탐색을 시작한다.
3. 뒤집어야할 리스트를 두고 dy, dx를 더하고 while문을 이용해서 한 방향의 탐색이 끝날때까지 진행한다.
4. 탐색이 끝나는 경우는 탐색하는 인덱스 값이 0이거나 플레이어 돌 색깔과 같은 경우이다. 그게 아니라면 reverse 리스트에 append한다.
5. 한 방향을 끝냈으면 reverse 리스트에서 뒤집어야할 돌을 뒤집는다. (색을 바꾼다)

 

 

2. 정답코드

T = int(input())
# T = 10
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    N, M = map(int, input().split())

    # 오셀로 초기 세팅
    maps = [[0] * N for _ in range(N)]
    flag = 0
    for i in range(N // 2 - 1, N // 2 + 1):
        for j in range(N // 2 - 1, N // 2 + 1):
            if flag == 0:
                maps[i][j] = 2
                flag = 1
            elif flag == 1:
                maps[i][j] = 1
                flag = 0
        else:
            flag = 1

    # 더 간단하게 세팅하는 방법
    # mid 법 N // 2
    # maps[mid][mid] = 2
    # maps[mid - 1][mid - 1] = 2
    # maps[mid - 1][mid] = 1
    # maps[mid][mid - 1] = 1

    # 상 하 좌 우 대각선 방향
    direct = ((0, 1), (1, 0), (-1, 0), (0, -1), (1, 1), (-1, 1), (-1, -1), (1, -1))

    for i in range(M):
        x, y, p = map(int, input().split())
        y -= 1
        x -= 1

        maps[y][x] = p

        # 8방향 탐색
        for j in range(8):
            dy, dx = direct[j]
            ny, nx = y + dy, x + dx

            # 뒤집어야 하는 돌 리스트
            reverse = []

            while True:
                if 0 <= ny < N and 0 <= nx < N:
                    if maps[ny][nx] == 0:
                        reverse = []
                        break
                    if maps[ny][nx] == p:
                        break
                    else:
                        reverse.append((ny, nx))

                    nx, ny = nx + dx, ny + dy
                else:
                    reverse = []
                    break

            for r, c in reverse:
                if p == 1:
                    maps[r][c] = 1
                else:
                    maps[r][c] = 2

    b, w = 0, 0
    for i in range(N):
        for j in range(N):
            if maps[i][j] == 1:
                b += 1
            elif maps[i][j] == 2:
                w += 1

    print(f"#{test_case} {b} {w}")

'Algorithm > SWEA' 카테고리의 다른 글

[SWEA] D3. 오목 판정  (0) 2022.11.17
[SWEA] D3. 최장 증가 부분 수열  (0) 2022.11.17
[SWEA] D3. 상호의 배틀필드  (1) 2022.11.14
[SWEA] D3. 회문2  (0) 2022.11.11
[SWEA] D3. N-Queen  (0) 2022.11.11