[PCCP] 시뮬레이션 - 청소 로봇(ver 2) | 파이썬

SangJin Ham·2023년 6월 26일
0
post-thumbnail

코딩테스트 역량 강화 교육(거점형 특화 프로그램)이라는 프로그램에 참여해 공부한 내용입니다.


앞서 공부한 시뮬레이션 알고리즘을 사용해 청소 로봇(ver 2) 문제를 풀어보겠다.

청소 로봇(ver 2)


문제

n*n 크기의 이차원 배열 격자판 0행 0열이 청소 로봇의 시작위치입니다.

청소 로봇은 다음 규칙에 따라 이동합니다.
1. 'U' 명령은 로봇이 위쪽으로 한 칸 이동합니다.
2. 'R' 명령은 로봇이 오른쪽으로 한 칸 이동합니다.
3. 'L' 명령은 로봇이 왼쪽으로 한 칸 이동합니다.
4. 'D' 명령은 로봇이 아래쪽으로 한 칸 이동합니다.
5. 만약 로봇이 명령을 수행할 경우 격자판 밖으로 나가는 경우라면 로봇은 해당 명령을 수행 하지 않고 무시합니다.

매개변수 n에 격자판 크기가 주어지고, moves에 청소 로봇에 명령을 내린 문자들이 차례대로 나열된 명령 문자열이 주어지면 청소 로봇이 최종적으로 멈춘 위치를 반환하는 프로그램을 작 성하세요.


입출력 예

격자판 크기(n)입력(moves)출력(answer)
5'RRRDDDUUUUUUL'[0, 2]
7'DDDRRRDDLL'[5, 1]
5'RRRRRDDDDDU'[3, 4]
6'RRRRDDDRRDDLLUU'[3, 3]

제한사항

  • moves의 길이는 100을 넘지 않습니다.
  • 3 <= n <= 50

작성한 코드

def solution(n, moves):
    r = c = 0
    dr = [-1, 0, 1, 0]
    dc = [0, 1, 0, -1]
    # 사전형으로 dr, dc의 인덱스를 설정 -> for문 생략 가능
    commands = {'U':0, 'R':1, 'D':2, 'L': 3}

    for move in moves:
        # 밖으로 나갔는지 확인할 rif, cif 설정
        rif = r+dr[commands[move]]
        cif = c+dc[commands[move]]
        
        # 격자판 밖으로 나가지 않을 때만 실행
        if rif >= 0 and rif < n and cif >= 0 and cif < n:
            r += dr[commands[move]]
            c += dc[commands[move]]
    
    return [r, c]   
    
print(solution(5, 'RRRDDDUUUUUUL'))
print(solution(7, 'DDDRRRDDLL'))
print(solution(5, 'RRRRRDDDDDU'))
print(solution(6, 'RRRRDDDRRDDLLUU'))

풀이

이 문제는 청소 로봇(ver 1)와 비슷하지만 격자판 밖으로 나갔을 시 무시하는 부분이 추가된 거다.

  1. 방향 배열 dr, dc12시부터 시계방향으로 설정
  2. commands에 명령어와 dr, dc의 인덱스를 사전형으로 선언함으로써 for문 생략
  3. r, c에 로봇의 초기 위치인 0으로 설정
  4. 격자판 밖으로 나갔는지 확인할 변수 rifcif 설정
  5. rifcif가 주어진 격자판 크기의 인덱스와 비교하며, 나가지 않았을 시에만 rc명령(move)에 맞게 이동
  6. 입력된 명령 moves을 다 실행하면 return [r, c]
profile
끄적끄적

0개의 댓글