ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Softeer] 소프티어 로봇이 지나간 경로(python)
    Python/Softeer 2022. 7. 26. 15:21
    728x90

    문제)

     

    알고리즘)

    출력 기준

    1.  출발 시작점 좌표값

    2. 시작시 로봇이 바라보는 방향

    3. 시작부터 끝까지 로봇이 이동 결과 (전진, 좌회전, 우회전)

     

    *시작점 찾기

    -그래프 탐색을 통해 '#'를 찾고 현재 위치 '#'에서 4방향을 탐색해 '.'이거나 범위외 좌표를 포함해 3개이상이라면

    해당 위치는 출발점으로 설정합니다.

     

    *이동

    - 이동전에 로봇의 현재 상태(방향)를 출력하고 시작한다.

    - 일반적인 BFS알고리즘을 사용해서 '#'를 찾으며 이동하고 방문처리는 '#' -> '.'로 바꾸면서 처리했습니다.

    - 3번쨰 출력물인 이동 결과는 코드상에서 방향잡기아래에 해당하는 코드로 처리했습니다.

     

     

     

     

     

    코드)

    #[인증평가(1차) 기출] 로봇이 지나간 경로
    #사수가 조작한 로봇이 i행 j열을 방문했다면 #이고, 방문하지 않았다면 .이다.
    
    import sys
    from collections import deque
    input = sys.stdin.readline
    
    n, m = map(int, input().split()) # column, row
    
    find_x = [-1, 0, 1, 0]
    find_y = [0, -1, 0, 1]
    direction_str = ['<', '^', '>', 'v']
    
    q = deque()
    
    graph = [list(sys.stdin.readline().rstrip()) for _ in range(n)]
    
    #시작점 찾기
    def find(x=0, y=0):
        
        for y in range(n):
            for x in range(m):
                if graph[y][x] != '#':
                    continue
                cnt = 0
                now = graph[y][x]
    
                for a in range(4):
                    f_x = x + find_x[a]
                    f_y = y + find_y[a]
    
                    if 0> f_x or f_x >= m or 0 >f_y or f_y >= n: 
                        cnt+=1
                        continue
    
                    if graph[f_y][f_x] != '#':
                        cnt += 1
    
                if cnt == 3:
                    return x, y
                
    
    s_x, s_y = find()
    
    print(s_y+1, s_x+1)
    for i in range(4):
        y, x = s_y+find_y[i], s_x+find_x[i]
        if 0> x or x >= m or 0 > y or y >= n or  graph[y][x] != '#':         
                continue
        if graph[y][x] == '#':
            s_state = i
            print(direction_str[i])
            break
    q.append([s_y, s_x])# 시작점 
    
    # 이동 시작
    while q:
        s_y, s_x = q.popleft()
        graph[s_y][s_x] = '.'
    
        for i in range(4):
            t_y = s_y + find_y[i]
            t_x = s_x + find_x[i]
    
            if 0> t_x or t_x >= m or 0 > t_y or t_y >= n or  graph[t_y][t_x] != '#':         
                continue
    
            elif  graph[t_y][t_x] == '#':
                #******************방향 잡기**************
                if direction_str[s_state] != direction_str[i]:
                    left, right = s_state-1, s_state+1
                    if right == 4:
                        right = 0
    
                    if direction_str[left] == direction_str[i]:
                        print('L',end='')
    
                    elif direction_str[right] == direction_str[i]:
                        print('R',end='')
                #******************************************
                #방문처리
                graph[t_y][t_x] = '.'
                print('A', end='')
                graph[t_y + find_y[i]][t_x + find_x[i]]= '.'
                q.append([t_y + find_y[i], t_x + find_x[i]])
                s_state = i #현재 바라보는 방향 갱신
    728x90

    'Python > Softeer' 카테고리의 다른 글

    [Softeer] 소프티어 강의실 배정(python)  (0) 2022.08.15
Designed by Tistory.