넘치게 채우기

[프로그래머스] 실습용 로봇 (PCCP 모의고사 #2 1번) 본문

PS/Programmers

[프로그래머스] 실습용 로봇 (PCCP 모의고사 #2 1번)

riveroverflow 2023. 12. 10. 15:34
728x90
반응형

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

 

프로그래머스

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

programmers.co.kr

프로그래머스 - 실습용 로봇

문제 유형 : 구현

문제 난이도 : Level 1(개인적인 체감)

 

문제 설명

컴퓨터공학과에서는 실습용 로봇을 이용해서 로봇 프로그래밍을 학습합니다. 실습용 로봇은 입력된 명령에 따라 x좌표와 y좌표로 표현되는 2차원 좌표 평면 위를 이동합니다. 하나의 명령은 하나의 문자로 주어지며 각 명령어에 따라 로봇이 수행하는 일은 다음과 같이 네 종류입니다.

  • 'R': 로봇이 오른쪽으로 90도 회전합니다.
  • 'L': 로봇이 왼쪽으로 90도 회전합니다.
  • 'G': 로봇이 한 칸 전진합니다.
  • 'B': 로봇이 한 칸 후진합니다.

명령어는 각각의 명령들이
모인 하나의 문자열로 주어지며, 차례대로 수행됩니다.

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

다음 그림은 번호 순서대로 명령어 "GRGLGRG"의 과정을 보여줍니다.

 

 

 

 

 

 

 

로봇에 입력된 명령어를 순서대로 담고 있는 문자열 command가 주어집니다. 로봇이 주어진 명령어들을 순서대로 모두 수행한 뒤 도착한 최종 위치의 좌푯값 x, y를 순서대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

 

 

풀이

명령어 문자열의 명령어들을 하나씩 실행해주면서 로봇의 state를 바꿔주면 된다.

나는 로봇이 보고 있는 방향을 다음과 같이 정의했다:

0: +y방향

1 : +x방향

2: -y방향

3: -x방향

이렇게 하고, R을 하면 dir = (dir+1) %4를 통해서 오른쪽 회전을 하도록 하였고,

L은 dir = dir==0? 3:dir-1을 통해서 왼쪽 회전을 구현시켰다.

 

그리고 각 방향에 따른 G와 B의 이동도 따로 다차원배열을 이용하여 각 방향의 G와 B이동을 구현시켰다.

 

코드

C++

#include <bits/stdc++.h>

using namespace std;

// table[0](+y방향)에서G(0): y++, 0에서B(1): y-- 이런식으로
vector<vector<vector<int>>> table = {
    {{0, 1}, {0, -1}},
    {{1, 0}, {-1, 0}},
    {{0, -1}, {0, 1}},
    {{-1, 0}, {1, 0}}  
};

void move(char command, vector<int> &pos, int& dir) {
    switch(command) {
    	// 우회전
        case 'R':
            dir = (dir+1)%4;
            return;
        // 좌회전
        case 'L':
            dir = dir == 0? 3 : dir-1;
            return;
        // 앞으로이동..
        case 'G':
            pos[0] += table[dir][0][0];
            pos[1] += table[dir][0][1];
            return;
        // 뒤로이동..
        case 'B':
            pos[0] += table[dir][1][0];
            pos[1] += table[dir][1][1];
            return;
    }
}

vector<int> solution(string command){
    //0: +y, 1: +x, 2: -y, 3: -x;
    // 처음에는 +y방향에 (0, 0)으로
    int dir = 0;
    vector<int> pos = {0, 0};
    
    // 한 글자씩 읽으면서 명령어 수행
    for(const auto &cmd : command) {
        move(cmd, pos, dir);
    }
    
    return pos;
}
 
728x90
반응형