728x90

헷갈렸던 부분

1. 배열의 size 고려

  • 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
    해당 조건을 고려하기 위해서는 배열의 크기를 제대로 인지하고 있어야 하는데 매번 문제 풀 때마다 이 부분이 악취가 나는 부분이었습니다.

size()는 배열이 3칸이면 2를 반환하는 것이 아닌 3을 반환한다.
즉 index는 0부터 시작함으로 우리가 조건을 확인할 때 -1을 하거나 =으로 확인해줘야 한다.

Q. 인지의 오류를 줄일 수 있는 방법은 없을까?

애초에 w와 h에 -1을 하고 =을 사용하면 조금 더 인지적 오류 없이 사용하기 좋을 것 같다는 생각이 드네요.

int h = park.size() - 1;
int w = park[0].size() - 1;

for(int i=0; i<= h; i++) {
        for(int j=0; j<= w; j++) {
            if(park[i][j] == 'S') {
                point = { i, j };
                goto start;
            }
        }
    }
for문은 배열의 내부를 돌기 때문에 =을 사용하고

if(point.first < 0 || point.first > h ||
               point.second < 0 || point.second > w) {
                point = temp;
                break;
 } 

범위를 나갔는지 확인할 때에는 >으로 확인하면 되니 인지적 오류가 줄어들 것 같습니다.

2. char to int, string to int 
매번 헷갈리나 char는 간단하게  - '0'을, string의 경우 stoi를 쓰면 된다.

중요하게 생각했던 점

1. 내 위치를 저장하는 구조
pair를 사용하여 한 묶음으로 가지고 다녔다.
배열을 사용해도 되나 인지적으로 0번이 세로고, 1이 가로임을 생각하는 것이 불편했다.
first와 second로 생각하면 현재 다루고 있는 배열과 다른 생각 묶음으로 가져갈 수있어서 구분이 쉽다고 생각했다.

2. 예외 조건 생각하기
동서남북으로 point를 변경하여 조건을 매번 확인해줘야 하는데 
동 서 남 북으로 반복문을 작성하고 확인하면 코드가 늘어나서 이동은 switch 문을 사용해서 코드의 양을 줄이도록 해봤다.

3. 레이블을 이용한 goto문
악마의 goto문이지만 이중 for문을 나갈 때 유용해서 애용해보려고 써봤습니다. 좋네요.
기존에는 bool check사용해서 한번 더 if문을 확인했는데 이중 for문에 한해서는 사용하는 것이 코드도 깔끔하고 좋네요.

#include <string>
#include <vector>
#include <iostream>
using namespace std;

// 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
// ["방향 거리", "방향 거리" … ]
// "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다.
// 명령 수행하기 전에 확인
// 👾 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
// 👾 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
// 위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
vector<int> solution(vector<string> park, vector<string> routes) {
    vector<int> answer;
    // 배열로 관리하는 방법도 있을 것 같음
    pair<int, int> point = { 0, 0 };
    
    int h = park.size();
    int w = park[0].length();
    // 배열의 크기가 3칸임으로 3칸이 나온다. 2칸이 아니라, index는 0부터 시작임으로 =으로 해야함.
    for(int i=0; i<h; i++) {
        for(int j=0; j<w; j++) {
            if(park[i][j] == 'S') {
                point = { i, j };
                goto start;
            }
        }
    }
    
start:
    for(string route: routes) {
        pair<int, int> temp = point;
        const char op = route[0];
        // char를 int로 변경하는 방법으로 - '0'이 있고, (int) <- 앤 잘 안 됨
        const int n = route[2] - '0';
        // string to i => stoi
        // const int n = stoi(route[2]);
        
        for(int i=0; i<n; i++){
            switch(op) {
                case 'N': point.first -= 1; break;
                case 'S': point.first += 1; break;
                case 'W': point.second -= 1; break;
                case 'E': point.second += 1; break;
            }
            
            // 범위가 w-1, h-1이라 =을 해줬는데 이게 의식적으로 잘 안 그려짐
            if(point.first < 0 || point.first >= h ||
               point.second < 0 || point.second >= w) {
                point = temp;
                break;
            } else if(park[point.first][point.second] == 'X') {
                point = temp;
                break;
            }
        }
    }
    answer.push_back(point.first);
    answer.push_back(point.second);
    
    return answer;
}

https://school.programmers.co.kr/learn/courses/30/lessons/172928

 

프로그래머스

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

programmers.co.kr

다른 사람 코드를 보고 느낀 점

int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};

switch를 사용하지 않고 이동을 하는 방법
-> 그래프 문제 사용할 때 많이 쓰던 방법인데 여기서도 이렇게 사용할 수 있구나 싶기도 하고 오히려 복잡한 것 같기도 한 것 같다는 생각이 드네요.

    int cx, cy;
                tie(cx, cy) = {i, j};

변수로 선언한 것들을 tie로 묶어서 받는 모습, 굳이란 생각도 들지만 저런 방법이 있다는 게 신기하네요.

반응형

+ Recent posts