코딩테스트 대비/Softeer

[Softeer/Python] [인증평가(1차) 기출] 로봇이 지나간 경로 ★★★☆☆ - 효과는 굉장했다!

bluetag_boy 2022. 7. 24. 19:07
반응형

 

 

Softeer

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

softeer.ai

 

 

SOLUTION

import sys
from collections import deque

def check(x, y):
    cnt = 0

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

        if 0 <= nx < H and 0 <= ny < W and maps[nx][ny] == '#':
            start = directions[i]
            cnt += 1

    if cnt > 1:
        return False

    return start


def bfs(i, j):
    path = deque([])
    queue = deque([[i,j]])
    visited[i][j] = True

    while queue:
        x, y = queue.popleft()
        
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            direction = directions[i]
            
            if 0 <= nx < H and 0 <= ny < W:
                if maps[nx][ny] == '#' and visited[nx][ny] == False:
                    visited[nx][ny] = True
                    path.append(direction)
                    queue.append([nx,ny])
                    

    return path


H, W = map(int, sys.stdin.readline().split())
maps = [list(sys.stdin.readline().rstrip()) for _ in range(H)]
visited = [[False] * W for _ in range(H)]
dx = [-1,0,1,0]
dy = [0,1,0,-1]
directions = ['^','>','v','<']
ans = []

for row in range(H):       
    for col in range(W):
        if maps[row][col] == '#' and check(row, col):
            path = bfs(row, col)
            print(row+1, col+1)
            print(path[0])
           
            current = path.popleft()
            
            cnt = 1
            for next in path:
                if current == next:
                    cnt += 1
                    current = next
                    
                    if cnt % 2 == 0:
                        ans.append("A")
                        cnt = 0
                        
                else:
                	# index가 감소 됐을 때 일치한다 -> 왼쪽으로 회전
                    if directions[directions.index(current) - 1] == next:
                        ans.append("L")
                            
                    else:
                    	# index가 증가 됐을 때 일치한다 -> 오른쪽으로 회전
                        ans.append("R")
                    
                    current = next
                    cnt = 1
                    
            for i in ans:
                print(i, end="")  
                    
            sys.exit()

 

 "명령어의 개수를 최소화하면서 목표를 달성할 수 있는 방법이 여러 가지라면, 그 중 한 가지를 아무거나 출력하면 된다."

라는 조건이 있으므로 만족하는 경로를 찾으면 sys.exit()을 이용해 바로 프로그램을 종료시킨다.

 

이 문제는 처음의 시작점이 어딘지 찾고, 시작 방향을 파악하는 것이 가장 중요하다. check() 함수를 이용해 시작지점과, 방향을 결정짓고,  arr 배열에 지금까지 이동한 방향들을 넣는다.

 

그 후, 조건문을 통해 어떻게 움직였는지에 대한 명령어들을 ans에 담아 조건에 맞게 출력한다.