티스토리 뷰

처음에 BFS 깊이 우선 탐색으로 풀려다가 막막해서 다른 사람의 풀이를 참고했다.
https://ansohxxn.github.io/programmers/114/

[C++로 풀이] 게임 맵 최단거리 (BFS)⭐⭐

📌 게임 맵 최단거리

ansohxxn.github.io

이분 참고함
1시간 투자해도 코드 완성이 안되면 그냥 바로 다른 코드 참고하는대신 복습하는 개인적인 룰이 있다.(변명변명)

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

struct Pos{
    int x;
    int y;
    Pos(int _x, int _y) {
        x = _x;
        y = _y;
    }
};
int solution(vector<vector<int>> maps)
{
    const int N = maps.size();
    const int M = maps[0].size();
    queue<Pos> q;
    
    vector<vector<int>> maps_dist(N,vector<int>(M)); //shortest distance vec
    
    vector<Pos> deltaCoord = {Pos(0,-1),Pos(1,0),Pos(0,1),Pos(-1,0)};
    //for the (0,0) first start
    maps_dist[0][0] = 1;
    q.push(Pos(0,0));
    maps[0][0] = 0;
    
    while(!q.empty()) {
        Pos current = q.front();
        q.pop();
        
        for(Pos delta : deltaCoord) {   //for all 4 direction
            Pos next_pos(current.x + delta.x, current.y + delta.y);
            //check effectiveness
            //1. check out of range
            if(next_pos.x < 0 || next_pos.y <0 || next_pos.x >= N || next_pos.y >= M)
                continue;
            //2. check can go there(already visit OR obstacle)
            if(maps[next_pos.x][next_pos.y] == 0)
                continue;
            
            q.push(next_pos);
            maps_dist[next_pos.x][next_pos.y] = maps_dist[current.x][current.y]+1;
            maps[next_pos.x][next_pos.y] = 0;
        }
    }
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            cout << maps_dist[i][j] << " ";
        }
        cout << endl;
    }
    // destination coord = (N-1,M-1)
    if(maps_dist[N-1][M-1] == 0)
        return -1;
    else
        return maps_dist[N-1][M-1];
}

첫 코드.
주어지는 맵이랑 똑같은 크기의 최단거리 맵을 만들어서 기록하고, 큐에 시작위치를 담고, maps에서 0으로 바꾼다음 큐가 빌때까지 루프를 돈다.
상하좌우 4방향에 대해서 유효성을 체크한다. 맵 바깥으로 가는 게 아닌지, 그 좌표의 값이 0이 아닌지(장애물 또는 이미 지나왔기에 0처리 된 경우)
이 유효성을 통과한다면 큐에 해당 다음 좌표를 넣고 현재 좌표는 0처리하고 다음 좌표의 최단거리를 현재 좌표의 최단거리+1로 갱신해준다.

모든 경로 탐색이 끝난 뒤 마지막 좌표의 값이 갱신되어있지 않다면 -1, 갱신되어있다면 그 값을 반환하게끔 한다.

정확성은 모두 맞췄는데, 효율성에서 0점이 나온다.
이미 통과한 다른 사람의 코드 풀이법을 훑은 다음에 내 방식을 적용하는 편이라 보통 풀이법이 보증되는 편이라 한방에 통과하던데 당황스러웠다.

효율성 올리기
내가 다르게 한 점을 생각해봤는데,

구조체 읽기를 자주 함 -> 이거때매 시간초과난다고 치면 구조체를 누가쓰겠음.. 이거때문이 아닐거임
방문 맵을 따로 만들지 않고 maps값을 0으로 만듦 -> 정확성은 맞으나 내가 생각하지 못한 부분에서 효율성이 떨어질수도(특정 조건을 캐치하지못해 중복체크를 자주한다던가의)
행,열이 표기법이 다름 -> 이거때매 시간초과날리가...

두번째 부분을 반영해서 해봤는데 역시나 시간초과 ㅠ
진짜 모르겠다. ㅠㅠㅠㅠㅠ 차이를 모르겠다고!!!

일단 나가야해서 저장 ㅜ 아 스트레스.



++ 알아냈음... 내 코드 체크를 위해서 maps_dist를 전체 출력하는 부분이 있는데 이거 안지우고 내서
아..................... 내 시간
ㅠㅠㅠ
ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
그치만 덕분에 문제 채점할때는 출력 다 지우고 하는 버릇이 제대로 박힐듯 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

'■ 알고리즘 > ◻ Programmers' 카테고리의 다른 글

[C++] 프린터  (0) 2022.11.26
[C++] 더 맵게  (0) 2022.11.23
[C++] 네트워크  (0) 2022.11.15
[C++] 타겟 넘버  (0) 2022.11.15
[C++] 피로도  (0) 2022.11.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함