본문 바로가기

Algorithm/SWEA

[SWEA] D3. 오목 판정

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AXaSUPYqPYMDFASQ&categoryId=AXaSUPYqPYMDFASQ&categoryType=CODE&problemTitle=&orderBy=INQUERY_COUNT&selectCodeLang=PYTHON&select-1=3&pageSize=10&pageIndex=4 

 

SW Expert Academy

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

swexpertacademy.com

 

 

1. 해결방법

완전 탐색 방법으로 해결하였다.
40분 정도 걸렸다.

본인은 오목 판에서 2중 for문으로 좌측 위쪽 부터 우측 아래까지 탐색할 것이기에 <오른쪽, 아래, 왼쪽 대각선, 오른쪽 대각선> 방향만 탐색하도록 하였다. (나머지는 의미 없음)

1. 2중 for문으로 'o'을 먼저 찾는다.
2. direct 방향의 초기값을 세팅해두고, 방향을 for문 돌려서 해당 방향에 오목이 얼마나 연결되어 있는지 확인한다.

3. 확인은 while문으로 하였고, 연결되어있을 때마다 count + 1을 해주었다.

 

 

2. 정답코드

T = int(input())
# T = 1
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    N = int(input())
    maps = [list(map(str, input().strip())) for _ in range(N)]
    chk = [[False] * N for _ in range(N)]

    direct = ((0, 1), (1, 0), (1, 1), (1, -1))
    flag = False

    for i in range(N):
        for j in range(N):
            if maps[i][j] == 'o':
                for k in range(4):
                    count = 1
                    dy, dx = direct[k]
                    ny, nx = i + dy, j + dx
                    while True:
                        if 0 <= ny < N and 0 <= nx < N:
                            if maps[ny][nx] == 'o':
                                count += 1
                                ny, nx = ny + dy, nx + dx
                            else:
                                break

                            if count == 5:
                                flag = True
                                break
                        else:
                            break
                    if flag == True:
                        break
            if flag == True:
                break
        if flag == True:
            break

    if flag:
        print(f"#{test_case} YES")
    else:
        print(f"#{test_case} NO")