관리 메뉴

JIE0025

[◾️][Softeer][level3] GINI야 도와줘 - 파이썬(Python) 본문

알고리즘/Softeer

[◾️][Softeer][level3] GINI야 도와줘 - 파이썬(Python)

Kangjieun11 2023. 2. 2. 14:59
728x90

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

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

 

문제

GINI는 현대자동차그룹에서 개발한 네비게이션이다. GINI는 너무나도 뛰어나 목적지에 도착하는 시간을 예측할 수 있다. 어느 날 태범이는 세차장에서 세차를 하고 집에 돌아가려고 하는데 소나기가 몰려오고 있다는 뉴스를 전해 들었다. 태범은 방금 세차한 차를 지키기 위해 GINI를 사용하여 무사히 집에 귀환하고자 한다!

 

지도는 R행과 C열로 이루어져있다. 비어있는 칸은 ‘.’로 표시되고, 소나기는 ‘*’로, 강은 ‘X’로 표시되어있다. 태범이의 집은 ‘H’로 표현되고, 태범이가 처음있던 세차장의 위치는 ‘W’로 표시된다.

 

매 분마다 태범이는 인접한 네 개의 칸(상, 하, 좌, 우)으로 이동할 수 있다. 소나기는 매 분마다 인접한 네 개의 칸(상, 하, 좌, 우)으로 확산한다. 태범이는 소나기와 강을 지나지 못하며, 소나기는 강과 태범이의 집에 옮겨지지 않는다.(소나기는 강으로 가면 소멸) 태범이가 무사히 집에 도착할 수 있을 때 몇 분 만에 도착할 수 있는 예측하는 GINI 네비게이션 프로그램을 만들어보자.

 

 

 

 


 

 

💻 내가 쓴 정답코드

 

사고과정은 코드에 주석으로 함께 달아놨다..

 

 

from collections import deque
import sys
input = sys.stdin.readline 

d= [[1,0],[0,1],[-1,0],[0,-1]]

def bfs( W_y, W_x, rains):
    queue = deque()
    #사람과 비가 동시에 작동해야 하므로 큐에, W의 위치와 *의 위치를 미리 입력한다.

    queue.append([W_y,W_x])
    visited[W_y][W_x] = 1

    for rain_y, rain_x in rains:
        queue.append([rain_y,rain_x])
        visited[rain_y][rain_x] = '*'


    while queue:
        nr, nc = queue.popleft()
        
        for i in range(4):
            dr = nr+d[i][0]
            dc = nc+d[i][1]

            if(0 > dr or dr >= mapr or 0>dc or dc >= mapc ):
                continue

            if(maps[dr][dc] == 'X'):
                continue

            #Move
            if maps[nr][nc] == '*': #현재 비 였음
                if maps[dr][dc] == '.': #이동가능한 곳임 (집이거나 사람이 아님)
                    maps[dr][dc] = '*'
                    visited[dr][dc] = '*'
                    queue.append([dr,dc])    
            elif visited[nr][nc] >= 1: #현재 사람이었음
                if visited[dr][dc] == False : # 이동가능한 곳임 
                    visited[dr][dc] = visited[nr][nc] + 1
                    queue.append([dr,dc])

        

    
mapr, mapc= map(int,input().split())

maps = []
for i in range(mapr):
    tmp = list(map(str,input()))
    if i != mapr-1:
        tmp = tmp[:-1]
    maps.append(tmp)

visited = [[False] * mapc for _ in range(mapr)]

#집의 위치 찾기
#사람의 처음 위치 찾기
#소나기 처음 위치 찾기

home = [-1,-1]
person = [-1,-1]
rains = []

for i in range(mapr):
    for j in range(mapc):
        if maps[i][j] == '.':
            continue 
        elif maps[i][j] == 'H':
            home[0], home[1] = i, j
        elif maps[i][j] == 'W':
            person[0], person[1] = i, j 
        elif maps[i][j] == '*':
            rains.append([i,j])
            

bfs(person[0], person[1], rains)
'''
print("maps")
print(maps)

print("visited")
print(visited)
'''
# 집의 위치를 바탕으로 visited 출력
# visited[집의][위치] 가 False 이면 -- FAIL출력
# 아니면 -- visited[집의][위치] -1 출력

result = visited[home[0]][home[1]] 

if result == False:
    print("FAIL")
else :
    print(result-1)

 

 

 

진짜 눈물 나는 문제다 정답 안보고 처음부터 끝까지 혼자서 풀었다...

 

어제 풀다가 안풀려서 집가고, 잠 잔다음 이상한데를 찾아서 수정하던중에...

테스트케이스 맞는데 여기서 더 뭘 해야할까 싶어서 일단 제출 눌러보자... 하고 눌렀는데 정답이 나왔다

 

테스트케이스가 몇개 없어서 다 맞는건지 ,,,

잘못 풀었을 수도 있는데 이게 왜 맞지 싶어서 눈물이 나왔다

 

 

그래도 테스트케이스가 다 맞았으니까 100점이 나온거지 라는 생각이 들면서 

동시에 내가 쓴 코드를 확신하지 못하는 내 자신이 안쓰럽다

 

 

 

이전보다는 성장했으니까 좀만 더 참고 열심히 해봐야겠다.....