알고리즘

[백준, 파이썬, 2615번] 오목

hminor 2023. 9. 19. 13:06

 

풀이

 

  • 기존 그래프 탐색처럼 방문 체크를 해서 풀려고 했지만
  • 뭔가 엄청나게 꼬이는 것을 감지했다.
  • 그래서 단순히 이전과 이후의 값을 비교하며 풀이.
  • 다만 이 또한 엄청 꼬이는 것을 감지
  • 그래서 그냥 조건을 많이 추가하더라도 하나씩 풀기로 마음 먹음
  • 처음 방향은 8방향으로 다 적용했지만 불필요하다고 생각이들어
  • 4방향(오른쪽 위 대각선, 오른쪽, 오른쪽 아래 대각선, 아래)으로만 탐색 후
  • 해당 방향을 li에 저장 후 해당 방향으로만 탐색하고자 함.
  • 여기서 이전 방향의 값이 현재 값과 같은 경우엔 중간의 값이기에 
  • 탐색을 하지 않도록 해야하는데 어떻게 조건처리를 해야할지 고민을 엄청나게 했다...
  • 그래서 너무 복잡해진 나머지 그냥 if문을 오지게 달아서 해결했음.
  • 그리고 마지막으로 sys.exit(0)을 하게 되면 실행 종료가 되어서
  • flag 처리로 반복문을 탈출할 필요없다는 것을 알게 되었다.

 

import sys
input = sys.stdin.readline
mtx = [list(map(int,input().rstrip('\n').split())) for _ in range(19)]
result,r_mtx,flag = 0,(0,0),False

for i in range(19):
    for j in range(19):
        if mtx[i][j]:
            li = []
            for dy,dx in [[-1,1],[0,1],[1,1],[1,0]]: # 방향 찾기
                if 0<=i+dy<19 and 0<=j+dx<19 and mtx[i+dy][j+dx] == mtx[i][j]:
                    if 0<=i-dy<19 and 0<=j-dx<19:
                        if mtx[i-dy][j-dx] != mtx[i][j]: li.append([dy,dx])
                    else:li.append([dy,dx])
            for dy,dx in li:
                y,x,cnt = dy+i,dx+j,1
                while 0<=y<19 and 0<=x<19 and mtx[y][x] == mtx[i][j]:
                    y,x,cnt = y+dy,x+dx,cnt+1
                if cnt == 5:
                    print(mtx[i][j])
                    print(i+1,j+1)
                    sys.exit(0)

print(0)