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)