관리 메뉴

A seeker after truth

백준 18428: 완전탐색, dfs bfs, 백트래킹 이 아닌 풀이 방법으로 pypy3 정답 코드들 중 실행시간 기준 전체 6등! 본문

Algorithm/문제풀이

백준 18428: 완전탐색, dfs bfs, 백트래킹 이 아닌 풀이 방법으로 pypy3 정답 코드들 중 실행시간 기준 전체 6등!

dr.meteor 2022. 6. 22. 10:04

사실 이게 dbfs 문제라고 했을 떄 감을 못잡았었다... 그냥 어렴풋한 감만 있는 느낌이었고, 애초에 그렇게 푸는게 왠지 비효율적일 것 같다고 생각이 들어서 이 풀이를 고안했다.

정석적인 풀이는 가능한 모든 빈공간 3개를 조합으로 뽑아서, 거기에 블록 놔보고 이게 정답 처리가 될수있는지 아닌지를 따져서 푸는 문제다. 저번에 푼 그 뱀 문제였나? 그거랑 매우 유사하다. 풀이 보니까 다들 그렇게 풀었고 나처럼 푼 사람은 나밖에 없었다!!!

 

 

454개 pypy3 코드 중

 

import sys
from collections import deque, defaultdict, Counter

input = sys.stdin.readline
N = int(input())
mapShape, teachers, obstacles, obstacles_cnt = deque([]), deque([]), defaultdict(set), deque([])
answer = True
for x in range(N):
    mapShape.append(list(map(str, input().split())))
    for y in range(N):
        if mapShape[x][y] == "T":
            teachers.append((x, y))


for x, y in teachers:
    for up in range(x - 1, -1, -1):
        if mapShape[up][y] == "S":
            if up != x - 1:
                for x_ in range(up+1, x):
                    obstacles[((x, y), "up")].add((x_, y))
                    obstacles_cnt.append((x_, y))
            else:
                answer = False
            break
    if not answer:
        print("NO")
        break

    for down in range(x + 1, N):
        if mapShape[down][y] == "S":
            if down != x + 1:
                for x_ in range(x+1, down):
                    obstacles[((x, y), "down")].add((x_, y))
                    obstacles_cnt.append((x_, y))
            else:
                answer = False
            break
    if not answer:
        print("NO")
        break

    for left in range(y - 1, -1, -1):
        if mapShape[x][left] == "S":
            if left != y - 1:
                for y_ in range(left+1, y):
                    obstacles[((x, y), "left")].add((x, y_))
                    obstacles_cnt.append((x, y_))
            else:
                answer = False
            break
    if not answer:
        print("NO")
        break

    for right in range(y + 1, N):
        if mapShape[x][right] == "S":
            if right != y + 1:
                for y_ in range(y + 1, right):
                    obstacles[((x, y), "right")].add((x, y_))
                    obstacles_cnt.append((x, y_))
            else:
                answer = False
            break
    if not answer:
        print("NO")
        break

if answer:
    obstacles_cnt = Counter(obstacles_cnt)
    obstacles_cnt = set(filter(lambda k: obstacles_cnt[k] >= 2, obstacles_cnt.keys()))
    cnt = len(obstacles_cnt)
    for v in obstacles.values():
        if not v.intersection(obstacles_cnt):
            cnt += 1

    if cnt <= 3:
        print("YES")
    else:
        print("NO")