https://softeer.ai/practice/6275

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

풀이

로봇을 정해진 방향으로 이동시키고 회전시키는 구현 문제이다. 

신경 써야할 점은 로봇이 A 명령을 받았을 때 2칸을 움직인다는 것과 처음 시작을 어디에서 해야하는지 이다.

이동을 2칸씩 하기 때문에 로봇이 길에서 한 칸을 건너뛰어서 이동하는 경우가 생길 수 있어 도착하는 지점과 중간에 있는 지점을 확인해줘야합니다.

처음 시작은 로봇 경로의 도착 지점 혹은 시작 지점을 찾아야 하는데 해당 지점은 근처 #의 개수를 통해 찾아 주었습니다.

코드

#include <iostream>
#include <vector>
#define MAX 26
using namespace std;

int a, b, startX, startY, dir;
char board[MAX][MAX];
int visited[MAX][MAX] = {};
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
char dirs[] = {'>', 'v', '<', '^'};
vector<char> commands;

void init(){
  ios_base::sync_with_stdio(false); 
  cin.tie(NULL); cout.tie(NULL);
  cin >> a >> b;

  for(int i = 0; i < a; i++){
    for(int j = 0; j < b; j++){
      cin >> board[i][j];
    }
  }
}

bool isValid(int x, int y) {    
    return x >= 0 && x < a && y >= 0 && y < b && board[x][y] == '#' && !visited[x][y];
}

void start(){
  for(int i = 0; i < a; i++){
    for(int j = 0; j < b; j++){
      int cnt = 0;
      for (int k = 0; k < 4; k++) {
        int nx = i + dx[k];
        int ny = j + dy[k];
          if (board[i][j] == '#' && isValid(nx, ny)){
            cnt++;
            dir = k;

            if(cnt > 1)
              break;
        }
      }
      if(cnt == 1){
        startX = i;
        startY = j;
        return;
      }
    }
  }
}

void move(int x, int y, int dir){
  visited[x][y] = true;

  for (int i = 0; i < 4; i++) {
    int new_dir = (dir + i) % 4;
    int nx = x + dx[new_dir];
    int ny = y + dy[new_dir];

    if (isValid(nx, ny)) {
      visited[nx][ny] = true;

      if (new_dir != dir) {
        int turn = new_dir - dir;
        if (turn == 1 || turn == -3)
          commands.push_back('R');
        else if (turn == -1 || turn == 3)
          commands.push_back('L');
      }
      commands.push_back('A');
        nx += dx[new_dir];
        ny += dy[new_dir];
      move(nx, ny, new_dir);
    }
  }
}

int main() {
  init();
  start();

  move(startX, startY, dir);
  cout << startX + 1 << " " << startY + 1 << "\n";
  cout << dirs[dir] << '\n';
  
  for (char command : commands) {
    cout << command;
  }
  
  return 0;
}

성능

+ Recent posts