article thumbnail image
Published 2022. 8. 25. 19:38

https://swexpertacademy.com/main/talk/solvingClub/problemView.do?solveclubId=AYHwPox6g0YDFAV6&contestProbId=AXaSUPYqPYMDFASQ&probBoxId=AYLD5RGq4GUDFASv&type=PROBLEM&problemBoxTitle=IM_%EB%8C%80%EB%B9%84&problemBoxCnt=10

SW Expert Academy

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

swexpertacademy.com


아이디어

  1. 2차원 리스트를 탐색해야한다.
  2. 델타를 사용한다. (단, 반경 체크는 필수로 해준다.)
  3. 시간 제한에 영향 받지 않으므로 그냥 모든 지점을 델타의 기준 점으로 잡는다.
  4. 모든 지점을 잡을 것이므로 델타는 오른쪽, 아래, 대각우좌밑으로, 대각좌우밑으로 4개만 만든다.
  5. 오목은 한 개만 있는 것 같다. 오목 찾으면 YES를 리턴하고 끝내는 함수를만든다.


풀이

def find_omok(N):
    for i in range(N):
        for j in range(N):
            for k in range(4):
                oh = 0
                for l in range(5):
                    nr, nc = i + dr[k] * l, j + dc[k] * l
                    if nr < 0 or nr >= N or nc < 0 or nc >= N:
                        break
                    else:
                        if omok[nr][nc] == 'o':
                            oh += 1
                if oh == 5:
                    return 'YES'
    return 'NO'

for tc in range(int(input())):
    N = int(input())
    omok = [list(input()) for _ in range(N)]

    dr = [0, 1, 1, 1]      # 우, 하, 좌우대각, 우좌대각
    dc = [1, 0, 1, -1]

    print(f'#{tc+1}', find_omok(N))
복사했습니다!