Programmers/기타

C++ / 프로그래머스 / 2회 모의고사 - 실습용 로봇

GitHubSeob 2024. 3. 25. 07:10
문제

 

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

 

프로그래머스

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

programmers.co.kr

 

문제풀이

 

'R'은 오른쪽으로 90도 회전, 'L'은 왼쪽으로 90도 회전,

'G'는 한 칸 전진, 'B"는 한 칸 후진하는 명령어이다.

로봇은 처음에 (0, 0) 위치에 +y 축을 향하여 놓여 있다.

 

2차원 벡터를 쓸 때 수학에서 나타내는 좌표와 달리, 아래쪽으로 갈수록 y가 증가하게 작성하고 있어서 이 부분에서 살짝 헷갈렸다.

네 방향을 나타내는 dy, dx 벡터는 90도로 회전할 때 편하게 사용하도록 상, 우, 하, 좌 순서로 좌표가 변하는 값을 넣어준다.

 

방향을 나타내는 변수를 dir로 둔다.

명령어가 'R'일 경우 (dir + 1) % 4를 한다. (위에서 상, 우, 하, 좌 순서로 좌표가 변하도록 벡터를 작성했으므로 +1을 하고 벡터의 크기가 네 방향인 네 개이므로 나머지 연산을 한다.)

 

'L'일 경우는 반대로 dir에서 -1을 하면 된다. 음수가 되는 경우가 발생할 수 있으므로 -1을 한 뒤 +4를 한 값인 +3을 하고 위와 마찬가지로 나머지 연산을 한다.

 

'G'인 경우는 y와 x에 단순히 dir방향으로 벡터에 해당하는 값을 더한다.

'B'인 경우는 현재 바라보는 방향의 정반대 방향으로 가야 하므로 +2를 한 뒤 나머지 연산을 한다.

(상인 경우 +2를 하여 하로, 좌인 경우는 +2를 하여 우로)

코드
#include <string>
#include <vector>
using namespace std;

int dy[4] = { 1,0,-1,0 };
int dx[4] = { 0,1,0,-1 };

vector<int> solution(string command) {
    vector<int> answer;
    int dir(0), y(0), x(0);

    for (int idx = 0; idx < command.size(); ++idx) {
        if (command[idx] == 'R') {
            dir = (dir + 1) % 4;
        }
        else if (command[idx] == 'L') {
            dir = (dir + 3) % 4;
        }
        else if (command[idx] == 'G') {
            y += dy[dir];
            x += dx[dir];
        }
        else if (command[idx] == 'B') {
            y += dy[(dir + 2) % 4];
            x += dx[(dir + 2) % 4];
        }
    }

    answer = { x, y };
    return answer;
}