[ BOJ / Python ] 17267번 상남자

황승환·2022년 9월 12일
0

Python

목록 보기
482/498

이번 문제는 BFS를 통해 해결하였다. 기존의 BFS와 달리 상하좌우로 한칸씩 탐색하지 않고, 상하로는 최대한으로 탐색하고, 그 이후에 좌우를 한칸씩 탐색하는 방법으로 해야 방문처리를 2차원 리스트로 수행하면서 모든 방문 위치를 저장할 수 있었다.

Code

from collections import deque
n, m = map(int, input().split())
l, r = map(int, input().split())
grid = [list(str(input())) for _ in range(n)]
sy, sx = 0, 0
for i in range(n):
    for j in range(m):
        if grid[i][j] == '2':
            sy, sx = i, j
            grid[i][j] = '0'
            break
dy, dx = [-1, 1, 0, 0], [0, 0, -1, 1]
visited = [[False for _ in range(m)] for _ in range(n)]
def real_man():
    q = deque()
    q.append((sy, sx, l, r))
    visited[sy][sx] = True
    result = 1
    while q:
        y, x, l_cnt, r_cnt = q.popleft()
        for i in range(2):
            ny, nx = y+dy[i], x+dx[i]
            while 0 <= ny < n and 0 <= nx < m and not visited[ny][nx] and grid[ny][nx] == '0':
                visited[ny][nx] = True
                result += 1
                q.append((ny, nx, l_cnt, r_cnt))
                ny, nx = ny+dy[i], nx+dx[i]
        if l_cnt > 0:
            ny, nx = y+dy[2], x+dx[2]
            if 0 <= ny < n and 0 <= nx < m and not visited[ny][nx] and grid[ny][nx] == '0':
                visited[ny][nx] = True
                result += 1
                q.append((ny, nx, l_cnt-1, r_cnt))
        if r_cnt > 0:
            ny, nx = y+dy[3], x+dx[3]
            if 0 <= ny < n and 0 <= nx < m and not visited[ny][nx] and grid[ny][nx] == '0':
                visited[ny][nx] = True
                result += 1
                q.append((ny, nx, l_cnt, r_cnt-1))
    return result
print(real_man())

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글