[소프티어] GINI야 도와줘

이정연·2023년 2월 2일
0

CodingTest

목록 보기
119/165

https://softeer.ai/practice/info.do?idx=1&eid=583

과정 설계

BFS 기본 골격에 문제 조건을 첨가해주면 된다.

큐의 원소를 (x,y,count,who)로 설정했다.

who: 태범이인지 소나기인지?
x,y: 태범 혹은 소나기의 좌표
count: 태범이의 현재까지 이동 거리

2트에 성공했는데 소나기가 여러 개 가능하다는 사실을 간과해서 틀렸다.
그리고 소나기가 먼저 움직인 후 태범이가 이동하도록 설계했다.

코드

import sys
from collections import deque

r,c = map(int,input().split())
graph = [['.']*c for _ in range(r)]
x,y = 0,0
rain_list = []
dx = [1,-1,0,0]
dy = [0,0,1,-1]
visited = [[False]*c for _ in range(r)]
answer = 'FAIL'
for i in range(r):
    temp = input()
    for j in range(c):
        graph[i][j] = temp[j]
for i in range(r):
    for j in range(c):
        if graph[i][j] == 'W':
            x,y = i,j
        if graph[i][j] == '*':
            rain_list.append((i,j))
q = deque([])
for i in range(len(rain_list)):
    q.append((rain_list[i][0],rain_list[i][1],0,'*'))
q.append((x,y,0,'W'))
visited[x][y] = True
while q:
    x,y,count,who = q.popleft()
    if who == '*':
        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]

            if 0<=nx<r and 0<=ny<c and graph[nx][ny] == '.':
                graph[nx][ny] = '*'
                q.append((nx,ny,0,'*'))
    else:
        if graph[x][y] == 'H':
            answer = count
            break

        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]

            if 0<=nx<r and 0<=ny<c and not visited[nx][ny] and (graph[nx][ny] == '.' or graph[nx][ny] == 'H'):
                q.append((nx,ny,count+1,'W'))
                visited[nx][ny] = True
print(answer)
profile
0x68656C6C6F21

0개의 댓글