이 문제는 배열의 유효범위를 이해하고, 입력으로 받은 문자열에서 한 글자씩 접근하여 장애물(X)이면 해당 이동을 진행하지 않고, 장애물이 아니면 이동을 진행하도록 하는 쉬운 문제였다.
로직을 이해하고 짜는데에는 금방이었는데, 3가지 케이스를 제외하고 모두 실패가 떠서 왜 그런가.. 테스트 케이스 결과를 보니, 처음 start 위치를 찾고 난 후부터는 전혀 이동하지 못하고 그대로 반환되는 것을 확인할 수 있었다.
원인은 너무 단순한 거였는데, string에서 이동 칸 수를 char로 읽어와서 int로 변경하는 과정에, ASCII 형식을 고려하지 않은 채로 static_case를 씌워 단순히 <int>로 형변환 하려고 해서 정확한 숫자값을 읽어오지 못한 것이었따...
char타입을 레퍼런스로 가져와서 const char 포인터에 저장해 준 후 char->int로 바꾸어주는 atoi함수를 통해 쉽게 해결하였다!!
const char *jump_char = &routes[i][2];
int jump = atoi(jump_char);
전체 코드는 아래와 같다.
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<string> park, vector<string> routes) {
vector<int> answer;
int start_row = 0;
int start_col = 0;
bool isbreak = false;
for (int i = 0; i < park.size(); i++) {//행길이
for (int j = 0; j < park[i].size(); j++) {//열길이
if (park[i][j] == 'S') {
start_row = i;
start_col = j;
isbreak = true;
break;
}
}
if (isbreak) break;
}
for (int i = 0; i < routes.size(); i++) {
const char *jump_char = &routes[i][2];
int jump = atoi(jump_char);//char를 읽어와 숫자로 변환하는 과정에서 오류가 발생했음. 이렇게 수정하니 해결됨
switch (routes[i][0])
{
case 'N':
if (start_row - jump >= 0){
bool flag = false;
for (int j = 1; j <= jump; j++) {
if (park[start_row - j][start_col] == 'X') {
flag = true;
break;
}
}
if (!flag) {
start_row -= jump;
}
}
break;
case 'S':
if (start_row + jump < park.size()) {
bool flag = false;
for (int j = 1; j <= jump; j++) {
if (park[start_row + j][start_col] == 'X') {
flag = true;
break;
}
}
if (!flag) {
start_row += jump;
}
}
break;
case 'W':
if (start_col - jump >= 0) {
bool flag = false;
for (int j = 1; j <= jump; j++) {
if (park[start_row][start_col-j] == 'X') {
flag = true;
break;
}
}
if (!flag) {
start_col -= jump;
}
}
break;
case 'E':
if (start_col + jump < park[0].size()) {
bool flag = false;
for (int j = 1; j <= jump; j++) {
if (park[start_row][start_col + j] == 'X') {
flag = true;
break;
}
}
if (!flag) {
start_col += jump;
}
}
break;
default:
break;
}
}
answer.push_back(start_row);
answer.push_back(start_col);
return answer;
}