본문 바로가기
문제 풀이/소프티어 (Softeer)

[Python] 소프티어 : [인증평가(1차) 기출] 로봇이 지나간 경로

by 희조당 2023. 2. 10.
728x90

 

https://softeer.ai/practice/info.do?idx=1&eid=577&sw_prbl_sbms_sn=145221 

 

Softeer

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

softeer.ai


💡 문제 풀이

구현 문제이다.

 

경로를 구하는 도중에 만약 다음 칸으로 진행할 수 없다면 왼쪽과 오른쪽을 확인해서 바로 경로를 찾게 했다.

✔️ 느낀 점

오랜만에 구현 문제를 푸는데 조금 아쉬웠다. 중복된 코드를 최대한 줄여보고 싶었는데 생각보다 많이 못 줄인 것 같다.

💻 코드

import sys
input = sys.stdin.readline

ORDER = ">v<^"
VISITIED = "#"
moves = {
    "^": (-1,0),
    "v": (1,0),
    "<": (0,-1),
    ">": (0,1),
}

a, b = map(int, input().split())
board = [list(input()) for _ in range(a)]

def isValidatePoint(x, y):
    if 0 <= x < a and 0 <= y < b:
        if board[x][y] == VISITIED:
            return True
    return False

def getStartPoint():
    for x in range(a):
        for y in range(b):
            if board[x][y] == VISITIED:
                cnt = 0
                
                for direction in ORDER:
                    nx = x + moves[direction][0]
                    ny = y + moves[direction][1]
                    
                    if isValidatePoint(nx, ny):
                        cnt += 1
                        
                if cnt == 1:
                    return (x, y)

def getDirection(x, y):
    for direction in ORDER:
        nx = x + moves[direction][0]
        ny = y + moves[direction][1]
        
        if isValidatePoint(nx, ny):
            return direction

def getCommand(start, startDirection):
    command = ""
    x, y = start
    currentDirection = startDirection
    
    while True:
        nx = x + moves[currentDirection][0]
        ny = y + moves[currentDirection][1]
        
        if isValidatePoint(nx, ny):
            command += "A"
            x = nx + moves[currentDirection][0]
            y = ny + moves[currentDirection][1]
        else: 
            idx = ORDER.index(currentDirection)
            
            newDirection = currentDirection
            for i in range(1, 4, 2): # 왼쪽 오른쪽
                direction = ORDER[(idx + i) % 4]
                
                nx = x + moves[direction][0]
                ny = y + moves[direction][1]
                
                if isValidatePoint(nx, ny):
                    if i == 1: command += "R"
                    else: command += "L"
                    newDirection = direction

            if currentDirection == newDirection: return command
            else: currentDirection = newDirection

def solution():
    x, y = getStartPoint()
    startDirection = getDirection(x, y)
    command = getCommand((x, y), startDirection)
    
    print(x+1, y+1)
    print(startDirection)
    print(command)

solution()

댓글