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;
}
성능
'코딩 테스트 준비 > 문제 풀이' 카테고리의 다른 글
[백준/BOJ] 13 N과 M - 1 (C ++) (1) | 2024.11.28 |
---|---|
[백준/BOJ] 1309 동물원 (C ++) (0) | 2024.11.26 |
[백준/BOJ] 2805 나무 자르기 (C++) (2) | 2024.11.24 |
[백준/BOJ] 1654 랜선 자르기 (C ++) (0) | 2024.11.22 |
[백준/BOJ] 10816 숫자 카드 2 (C ++) (0) | 2024.11.21 |