기록

프로그래머스_거리두기 확인하기 본문

코딩테스트/python

프로그래머스_거리두기 확인하기

youngyin 2021. 8. 28. 21:54

문제

https://programmers.co.kr/learn/courses/30/lessons/81302

 

코딩테스트 연습 - 거리두기 확인하기

[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]

programmers.co.kr

풀이

 

이 문제는 DFS BFS 2가지 방법으로 모두 풀이 가능하다. 그래프의 크기가 5x5로 고정이기에 시간 초과  메모리 초과를 고려하지 않아도 된다.

 

깊이를 초과하지 않는 선에서 탐색을 진행한다. 

1. PP 패턴

2. POP 패턴

2가지가 나타나지 않으면 거리두기를 지키고 있다고 판단한다.

 

깊이 1

깊이 2

코드

# 5줄 5행 범위 내에 있는지 확인
check = lambda i, j : 0<=i<5 and 0<=j<5

def f(place) : 
    for i in range(5) : 
        for j in range(5) : 
            if place[i][j]=='P' : 
                stack = [(i, j, place[i][j])]

                while stack : 
                    mi, mj, m = stack.pop()
                    if m=='PP' : return 0
                    if m=='POP' : return 0

                    if len(m)<3 : # ↑, ←, ↓, →
                        for i_, j_ in [(mi-1, mj), (mi, mj-1), (mi+1, mj), (mi, mj+1)] : 
                            if check(i_, j_) and (i, j)!=(i_, j_) : 
                                stack.append((i_, j_, m+place[i_][j_]))
    return 1

def solution(places): 
    return [f(p) for p in places]

 

 

Comments