프로그래머스 게임 맵 최단거리(전역변수와 지역변수)

Yujin-Shim·2023년 8월 4일
0

codingtest-cpp

목록 보기
7/7

그동안 풀었던 최단거리 문제 = BFS를 이용한 문제로 접근하여 풀었다.

오늘 글에서 다루고 싶은 내용은 문제풀이가 아니다.
벨로그를 조금 더 troubleshooting에 초점을 맞춰서 작성해보려고 한다.
내가 적은 velog를 다시 읽어보니 뭔가 나의 실력을 쌓을 때 도움이 되는 방향인 것 같지 않았다.
백준이나 프로그래머스 문제를 풀면서 만나는 다양한 문제들이 왜 나타났는지, 그리고 어떻게 해결했는지를 중점적으로 적고자 한다.

문제 자체는 전역변수& 지역변수와 관련은 없다.
문제를 만나고 나는 익숙하게 큐를 이용한 BFS 형태로 문제를 풀었다.
그런데, 결과를 제출하고보니 효율성 부분에서 통과하지 못한 것이다.

처음에는 if문을 분리하지 않아서 그런가 했다.
수정해도 효율성 통과를 하지 못했으므로 아니다.

그동안 백지 상태에서 코드를 다 적어야하는 백준과 달리 프로그래머스는 기본적인 틀이 제공되어있다.

그래서 내가 아무런 의심이나 생각없이 main문 안에서 변수들을 선언한 것이다.
여기에서 효율성 통과를 하지 못한 이유가 나온다.

왤까?

그전에 한번 공부를 했었던 내용인데 코드를 짜다보니 간과한 부분이다.

프로그램의 메모리 공간

프로그램이 운영체제로부터 할당받는 대표적인 메모리공간이 있다.
1. 코드 (code) 영역
2. 데이터 (data) 영역
3. 힙 (heap) 영역
4. 스택 (stack) 영역

자료출처: 코딩 시그널

내가 main문 안에서 변수를 선언하였으니 이는 지역변수로 선언한 것이다. 이렇게 되면 컴파일 시간에 영향을 미치게 된다.

전역변수는 DATA 영여긍로 훨씬 low memory로 선언할 수 있다.
그래서 내가 변수들을 전역변수로 (main 함수 밖으로) 선언하고 나니 효율성 테스트를 통과한 것이다.

코딩을 하다보면 이런 부분을 놓칠 수도 있다는 생각이 들며 약간의 위기감을 느꼈다...ㅎㅎ
왜냐하면 테스트케이스에서는 에러 없이 잘 작동했기 때문이다.

방심하지 말고 변수를 적는 위치도 신중하게 설정하자 ^^

전체 코드

#include<vector>
#include <queue>
using namespace std;

int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int count[101][101];
bool visited[101][101];
queue<pair<int,int>> q;

int solution(vector<vector<int>> maps)
{
    int answer = 0;
    int n = maps.size();
    int m = maps[0].size();
    
    q.push({0,0});
    visited[0][0] = true;
    count[0][0] = 1;
    
    while(!q.empty())
    {
        int x = q.front().first;
        int y = q.front(). second;
        q.pop();
        
        for(int step = 0; step<4; step++)
        {
            int x_step = x + dx[step];
            int y_step = y + dy[step];

            if (x_step < 0 || y_step < 0 || x_step >= n || y_step >=m) continue;
            if (visited[x_step][y_step]) continue;
            if (maps[x_step][y_step] != 1) continue;

            
            visited[x_step][y_step] = true;
            q.push({x_step, y_step});
            count[x_step][y_step] = count[x][y] + 1;
        }
    }

    answer = count[n-1][m-1];
    if(!answer)
        answer = -1;
    return answer;
}

2개의 댓글

comment-user-thumbnail
2023년 8월 4일

이런 유용한 정보를 나눠주셔서 감사합니다.

1개의 답글