b_오목_2615

source
type 📌 개발노트
topics 600-알고리즘 & 코딩테스트 613 BFS & DFS
types 문제풀이
정답여부 성공

문제

오목 (5개만 ㅇㅈ해드림)
ㅇㅈ되는 오목중 왼쪽 > 같으면 위 에있는 인덱스 뽑아내샘
둘이 동시에 이기는 경우는 없음

정답

  • 방향을 사방으로가는게 아니라 방향중 첫스타트가 왼쪽이 되는걸 먼저 돌려야함
  • 이후에 확인할때 방문햇음으로 확인하면 겹치는게 문제생길 수 있으므로 가려는 방향과 음수인 반대값에 이미 같은값이있으면 방문햇음으로 판단하면 됨
import sys
import math
import heapq

farr = []
input =list( map(int,sys.stdin.readline().strip().split()))
xlen = len(input)
while input:
    farr.append(input)
    input = list(map(int,sys.stdin.readline().strip().split()))
# <span id="for-fa-in-farr"></span>for fa in farr:
# <span id="printfa-"></span>print(fa) 
ylen = len(farr)
# <span id="printxlenylen"></span>print(xlen,ylen)


def isInArr(y,x):
    if y >=0 and ylen>y and x>=0 and xlen>x:
        return True
    return False

def dfs(tarr,dy,dx,y,x,depth):
    if depth>=6 : return 6
    ty = y + dy
    tx = x + dx
    # print(ty,tx,depth)
    if isInArr(ty,tx):
        if tarr[y][x]!= tarr[ty][tx]:
            return depth
        return dfs(tarr,dy,dx,ty,tx,depth+1)
    return depth
# <span id="한방향으로-가니까-중복될-리가-없음용"></span>한방향으로 가니까 중복될 리가 없음용
def visiting():
    moves = [[1,0],[1,1],[0,1],[-1,1]] # 대칭인건 지워도됨
    for i in range(ylen):
        for j in range(xlen):
            if farr[i][j] !=0:
                for my,mx in moves:
                    # print("dfs",i,j,my,mx,'---')
                    cv = farr[i][j]
                    dv = farr[i-my][j-mx] if isInArr(i-my,j-mx) else -1 # 반대방향에 이미같은게 있으면 계산된거
                    if cv != dv:
                        d=dfs(farr,my,mx,i,j,1)
                        # print("dfs end",d)
                        if d == 5:              
                            return f"{farr[i][j]}\n{i+1} {j+1}"
    return 0
result = visiting()
print(result)