기록하는 습관

[삼성sw역량테스트 - 기출] 구슬 탈출2 본문

알고리즘/[문제풀이] 백준

[삼성sw역량테스트 - 기출] 구슬 탈출2

로그뉴 2020. 10. 11. 13:59

www.acmicpc.net/problem/13460

 

13460번: 구슬 탈출 2

첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B'

www.acmicpc.net

#구슬 탈출2
from sys import stdin
from collections import deque
input = stdin.readline

n,m = map(int, input().split())
graph = [list(input().strip()) for _ in range(n)]
check = [[[[False] * m for _ in range(n)] for _ in range(m)] for _ in range(n)]
dx, dy = (-1, 0, 1, 0), (0, 1, 0, -1)
q = deque()

def init():
    rx, ry, bx, by = [0] * 4
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 'R':
                rx, ry = i, j
            if graph[i][j] == 'B':
                bx, by = i, j
    q.append((rx, ry, bx, by, 0))
    check[rx][ry][bx][by] = True
    
def move(x, y, dx, dy, c):
    while graph[x + dx][y + dy] != '#' and graph[x][y] != 'O':
        x += dx
        y += dy
        c += 1
        
    return x, y, c

def bfs():
    while q:
        rx, ry, bx, by, count = q.popleft()
        if count >= 10:
            print(-1)
            return
        
        for i in range(4):
            nrx, nry, rc = move(rx, ry, dx[i], dy[i], 0)
            nbx, nby, bc = move(bx, by, dx[i], dy[i], 0)

            if graph[nbx][nby] == 'O':
                continue
            if graph[nrx][nry] == 'O':
                print(count + 1)
                return
            if nrx == nbx and nry == nby:
                if rc > bc:
                    nrx -= dx[i]
                    nry -= dy[i]
                else:
                    nbx -= dx[i]
                    nby -= dy[i]
            if not check[nrx][nry][nbx][nby]:
                check[nrx][nry][nbx][nby] = True
                q.append((nrx, nry, nbx, nby, count+1))
    print(-1)

init()
bfs()

 

 

구슬을 굴리면서 빨간 구슬과 파란 구슬의 이동 거리를 비교해 겹치지 않도록 처리하는 것이 아이디어.

생각보다 어려웠는데 이 분 블로그를 참고했더니 어떻게 풀지 감이 확 잡혔다.

rebas.kr/725

 

BOJ 13460 · 구슬 탈출 2

알고리즘 분류 : BFS  구슬 탈출 시리즈 두 번째 문제다. 첫 번째 문제인 '구슬 탈출'을 풀었으면, 이 문제는 쉽게 해결할 수 있다. 출력값만 바꾸면 된다. 자세한 내용은 이전 문제 참조. 10번 이하

rebas.kr

 


삼성 서류를 합격했다.

돌아오는 일요일에 SW역량테스트를 보게 되어 급하게 DFS/BFS문제를 풀어야 한다..

백준에 있는 기출문제를 다 풀고 가는게 나의 목표..!

 

첫 문제가 구슬탈출2인데 하필 정답률 25%되는 어려운 문제라 힘들었다..

'알고리즘 > [문제풀이] 백준' 카테고리의 다른 글

[백준] 2504 괄호의 값  (0) 2021.05.13
[백준] 2346 풍선 터뜨리기  (0) 2021.05.11
[백준] DP - 동전1  (0) 2020.10.04
[백준] DP - 연속합  (0) 2020.10.03
[백준] DP - RGB 거리  (0) 2020.10.03
Comments