티스토리 뷰

- 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/169199

- 풀이

나는 사실 프로그래머스를 거의 안 푼다. 입출력 자체가 백준이 나에게 좀 더 편하기도 하고.. 백준에 너무 익숙해져버린 나머지 프로그래머스는 손을 잘 안댈 때가 많았는데 백준 풀다가 현타가 조금 와서 프로그래머스 문제를 한 번 풀어봤다.

 

이 문제가 레벨 2 문제였는데, 백준에서 이 문제와 비슷한 아이디어를 쓰는 구슬탈출 문제가 골1인걸 보면 체감상 이 문제도 한 레벨 3 정도는 되야 하지 않을까 ? 싶은 생각이 들기도 했다(근데 구슬탈출 문제가 더 어렵긴 하다).

 

풀이를 보자면, bfs 문제인데 그냥 탐색이 아니라 벽이나 장애물에 걸렸을 때 횟수를 카운트 해서 구현하는 문제였다.

장애물을 만났을 때, 그리고 벽을 탈출했을 때를 염두에 두고 구현하면 되는 문제다.

 

- 코드

from collections import deque
dx = [0,0,-1,1]
dy = [-1,1,0,0]

def solution(board):
    N, M = len(board), len(board[0])
    queue = deque()
    visited = [[0] * M) for _ in range(N)]
    for i in range(N):
        for j in range(M):
            if board[i][j] == 'R':
                visited[i][j] = 1
                queue.append((i, j))
    while queue:
        a, b = queue.popleft()
        
        if board[a][b] == 'G':
            return visited[a][b] - 1
        
        for i in range(4):
            nx, ny = a, b
            while True:
                nx, ny = nx+dx[i], ny+dy[i]
                if 0 <= nx < N and 0<= ny < M and board[nx][ny]=='D':
                    nx -= dx[i]
                    ny -= dy[i]
                    break
                if nx<0 or nx>=N or ny<0 or ny>=M:
                    nx -= dx[i]
                    ny -= dy[i]
                    break
            if not visited[nx][ny]:
                visited[nx][ny] = visited[a][b] + 1
                queue.append((nx, ny))
                                  
    return -1
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함