https://school.programmers.co.kr/learn/courses/30/lessons/172928
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
로봇 강아지가 장애물('X')과 길('O')로 이루어진 공원에서 주어진 명령에 따라 이동한다.
이동 조건은 다음과 같다:
- 명령 형식: "방향 거리" (예: "E 5"는 동쪽으로 5칸 이동).
- 이동 조건:
- 공원을 벗어나면 이동하지 않음.
- 이동 경로에 장애물이 있으면 이동하지 않음.
로봇 강아지가 모든 명령을 수행한 후의 최종 위치를 [세로 좌표, 가로 좌표]로 반환한다.
공원의 좌측 상단 좌표는 (0, 0), 우측 하단 좌표는 (H - 1, W - 1).
풀이 방법
전형적인 구현 문제다.
주어진 조건에 맞춰서 로봇 강아지의 이동 경로를 처리할 함수와 논리를 설계하면 된다.
장애물과 공원의 경계를 고려해야 하며, 이를 효율적으로 처리할 수 있는 조건 검증 함수를 작성하는 것이 핵심이다.
구현 과정에서 주어진 조건을 하나씩 코드로 풀어나가는 과정이 중요하다.
풀이 코드
#include <string>
#include <vector>
#define MAX_SIZE 50
using namespace std;
int parkint[MAX_SIZE][MAX_SIZE];
int x, y, park_width, park_height;
bool check_condition(int ny, int nx, int sign);
vector<int> solution(vector<string> park, vector<string> routes) {
vector<int> answer;
park_width = park[0].size();
park_height = park.size();
for(int i=0; i<park_height; i++){
for(int j=0; j<park_width; j++){
if(park[i][j] == 'S'){
y = i;
x = j;
parkint[i][j] = 0;
}
else if(park[i][j] == 'O') parkint[i][j] = 0;
else if(park[i][j] == 'X') parkint[i][j] = 1;
}
}
for(string s : routes){
char direction = s[0];
int num = s[2]-'0';
if(direction == 'E'){
if(check_condition(y, x+num, 1)) x+=num;
}
else if(direction == 'S'){
if(check_condition(y+num, x, 1)) y+=num;
}
else if(direction == 'W'){
if(check_condition(y, x-num, -1)) x-=num;
}
else if(direction == 'N'){
if(check_condition(y-num, x, -1)) y-=num;
}
}
answer.push_back(y);
answer.push_back(x);
return answer;
}
bool check_condition(int ny, int nx, int sign){
if(nx < 0 || ny < 0 || nx >= park_width || ny >= park_height) return false;
//도착지가 x인지부터 고려
if(parkint[ny][nx] == 1) return false;
//가로 탐색
if(nx != x){
for(int i=x; i!=nx; i+=sign){
if(parkint[y][i] == 1) {
return false;
}
}
}
//세로 탐색
else if(ny != y){
for(int i=y; i!=ny; i+=sign){
if(parkint[i][x] == 1){
return false;
}
}
}
return true;
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] Lv.1 가장 가까운 같은 글자 c++ (10) | 2025.01.06 |
---|---|
[프로그래머스] Lv.0 문자열 계산하기 c++ (2) | 2025.01.06 |
[프로그래머스] Lv.1 비밀지도 c++ (0) | 2025.01.05 |
[프로그래머스] Lv.1 카드뭉치 c++ (0) | 2025.01.05 |
[프로그래머스] Lv.1 행렬의 덧셈 c++ (0) | 2025.01.03 |