코딩테스트/DFS,BFS,플러드필

[DFS/BFS] (백준) 감시 피하기 - 파이썬

영최 2024. 8. 30. 16:15
728x90

링크: https://www.acmicpc.net/problem/18428

✅ nr,nc 부분을 1) nr=r+dr[d] 이렇게 해서 무한루프를 돌게 만들었고 -> nr+=dr[d] , 2) nr+=dr[d] 을 내용 전에다 써버려서 초기값을 생략한채로 반복문을 돌렸다.  nr,nc 지정할때 다시한번 로직이 맞는지 눈으로 확인해보자

from itertools import combinations

def isFind(r,c):
    d = 0
    while d < 4:
        nr,nc = r+dr[d],c+dc[d]
        while True:
            if not(0<=nr<N and 0<=nc<N):
                break
            if data[nr][nc]=="O":
                break
            elif data[nr][nc]=="S":
                return True
            nr+=dr[d]
            nc+=dc[d]
        d+=1
    return False

def solution(N,data):
    T_list, X_list = [],[]
    for i in range(N):
        for j in range(N):
            if data[i][j]=="S":
                continue
            elif data[i][j]=="T":
                T_list.append((i,j))
                continue
            X_list.append((i,j))
    for combi in combinations(X_list,3):
        #넣기
        for r,c in combi:
            data[r][c]="O"
        flag = True
        for r,c in T_list:
            if isFind(r,c):
                flag=False
                break
        if flag:
            return "YES"
        #뺴기
        for r,c in combi:
            data[r][c]="X"
            

    return "NO"




N = int(input())
data = [list(input().split()) for _ in range(N)]
dr = [-1,0,1,0]
dc = [0,1,0,-1]
print(solution(N,data))

 

728x90