본문 바로가기

알고리즘/프로그래머스_Python

[Programmers] PCCP 모의고사#2 1번-실습용 로봇

 

https://school.programmers.co.kr/learn/courses/15009/lessons/121687

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

def solution(command):
    answer = [0, 0]

    dx = [0, 0, -1, 1] # 상하좌우 0 1 2 3
    dy = [1, -1, 0, 0]
    Rdir = ['U', 'R', 'D', 'L']
    Ldir = ['U', 'L', 'D', 'R']
    dir = 'U'
    
    Rturn_num = 0
    Lturn_num = 0
    for c in list(command):
        if c == 'R':
            Rturn_num = Rdir.index(dir)
            Rturn_num += 1
            dir = Rdir[Rturn_num%4] # 오른쪽 회전 방향 변경
        elif c == 'L':
            Lturn_num = Ldir.index(dir)
            Lturn_num += 1
            dir = Ldir[Lturn_num%4] # 왼쪽 회전 방향 변경
        elif c == 'G':
            if dir == 'U': # 상
                answer[0], answer[1] = answer[0] + dx[0], answer[1] + dy[0]
            elif dir == 'D':
                answer[0], answer[1] = answer[0] + dx[1], answer[1] + dy[1]
            elif dir == 'L':
                answer[0], answer[1] = answer[0] + dx[2], answer[1] + dy[2]
            else:
                answer[0], answer[1] = answer[0] + dx[3], answer[1] + dy[3]
        else: # 'B'
            if dir == 'U':
                answer[0], answer[1] = answer[0] + dx[1], answer[1] + dy[1]
            elif dir == 'R':
                answer[0], answer[1] = answer[0] + dx[2], answer[1] + dy[2]
            elif dir == 'L':
                answer[0], answer[1] = answer[0] + dx[3], answer[1] + dy[3]
            else:
                answer[0], answer[1] = answer[0] + dx[0], answer[1] + dy[0]
                
    return answer

포인트

방향 이동을 시켜줄 때 Rdir, Ldir을 만들어서 현재 방향에서 1을 더해주면 (오른쪽 혹은 왼쪽으로 한 번 회전하면) 해당 방향이 되도록 만들어줬다. 

만약 4번 움직이면 제자리에 오기때문에 %4로 나눠서 다시 같은 값이 오게 된다.

 

방향을 이동시켜주는 부분의 코드가 조금 지저분해서 다른 풀이를 찾아봤다.

 

고수의 코드

def solution(command):
    path = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 상 우 하 좌
    x = y = d = 0
    
    for i in command:
        if i == 'R':
            d = (d+1)%4
        elif i == 'L':
            d = (d+3)%4
        elif i == 'G': # 해당 방향으로 한 칸 이동
            x += path[d][0]
            y += path[d][1]
        elif i == 'B': # 빼주면 상->하 우->좌 반대 방향이 된다
            x -= path[d][0]
            y -= path[d][1]
            
    return [x, y]

 

왼쪽으로 회전하는걸 따로 만들어줄 필요가 없다!

더하는게 아니라 빼주면 뒤로 이동이 되기 때문에, 그리고 좌로 이동하는건 3을 더해주면 된다.

코딩하기 전에 규칙을 먼저 찾아보자.