[회고록] 조그만 실수 (feat 프로그래머스)

Updated:

코딩중 조그마한 실수

오늘 프로그래머스 2020 카카오신입 공채 문제를 풀다가 시간이 훌쩍 가버렸다. 물론 답을 구현하는데 상당히 많은 양의 코드작성이 필요하긴 했지만, 다 작성을 했는데도 결과가 이상하게 나왔다.

블록 이동시키키 문제

위의 링크 문제인데 수십번의 코드 리뷰끝에 드디어 발견하였는데 정말 헛웃음이 나왔다. 그것은 바로 이부분

bool canMove(int row1, int column1, int row2, int column2, vector<vector<int> > board){
    int n = board.size();
    
    if(row1 < 1 || row1 > n || column1 < 1 || column1 > n || board[row1][column1] == WALL ||
        row2 < 1 || row2 > n || column2 < 1 || column2 > n || board[row2][column2] == WALL){
        return false;    
    }    
    return true;
}


board[row1][column1] 부분에서 -1 을 해주지 않아서 엉뚱한 결과가 나온것이다. 그렇기 때문에 그부분만 추가해주면 된다. 사실 조그마한 실수같지만 그 결과는 전혀 다르기에 큰 실수라고 할 수도 있나?

bool canMove(int row1, int column1, int row2, int column2, vector<vector<int> > board){
    int n = board.size();
    
    // 움직일수 있는지 확인, 참고: board 인덱스에 -1 을 해준이유는 시작 행과 열이 1부터 시작하기 때문이다
    if(row1 < 1 || row1 > n || column1 < 1 || column1 > n || board[row1-1][column1-1] == WALL ||
        row2 < 1 || row2 > n || column2 < 1 || column2 > n || board[row2-1][column2-1] == WALL){
        return false;    
    }    
    return true;
}

모든 행과 열은 0부터가 아니라 1부터 시작하기 때문에 board 벡터의 인덱스는 항상 -1 이 된 상태여야 한다. 그렇지 않으면 인덱스가 초과할것이다.
예전보다야 훨씬 나아졌지만 아직도 배열이나 벡터를 활용하는 문제가 나오면 가끔이지만 이런 실수를 한다. 거의 모든 알고리즘은 벡터나 배열의 인덱스를 잘 이해하고 활용하면 효과적으로 문제를 풀어 나갈수 있다. 기억하자. 시작 행과 열이 0이 아니라 1 인 경우라면 이렇게 인덱스를 신경써줘야 한다.

Categories:

Updated:

Leave a comment