ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [programmers] 무인도 여행_c++
    PROGRAMMERS/C++ 2024. 2. 15. 19:24

    연습문제 - 무인도 여행 Lv. 2

    문제

    메리는 여름을 맞아 무인도로 여행을 가기 위해 지도를 보고 있습니다.

    지도에는 바다와 무인도들에 대한 정보가 표시돼 있습니다.

    지도는 1 x 1크기의 사각형들로 이루어진 직사각형 격자 형태이며, 격자의 각 칸에는 'X' 또는 1에서 9 사이의 자연수가 적혀있습니다.

    지도의 'X'는 바다를 나타내며, 숫자는 무인도를 나타냅니다. 이때, 상, 하, 좌, 우로 연결되는 땅들은 하나의 무인도를 이룹니다.

    지도의 각 칸에 적힌 숫자는 식량을 나타내는데, 상, 하, 좌, 우로 연결되는 칸에 적힌 숫자를 모두 합한 값은

    해당 무인도에서 최대 며칠동안 머물 수 있는지를 나타냅니다.

    어떤 섬으로 놀러 갈지 못 정한 메리는 우선 각 섬에서 최대 며칠씩 머물 수 있는지 알아본 후 놀러갈 섬을 결정하려 합니다.

     

    지도를 나타내는 문자열 배열 maps가 매개변수로 주어질 때,

    각 섬에서 최대 며칠씩 머무를 수 있는지 배열에 오름차순으로 담아 return 하는 solution 함수를 완성해주세요.

    만약 지낼 수 있는 무인도가 없다면 -1을 배열에 담아 return 해주세요.

     

    코드

    #include <string>
    #include <vector>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    int xlen, ylen;
    int dx[] = {0, 0, -1, 1};
    int dy[] = {-1, 1, 0, 0};
    bool visited[101][101];
    
    int bfs(vector<string>maps, int i, int j) {
        queue<pair<int, int> > q;
        q.push(make_pair(i, j));
        int cnt = maps[i][j] - '0';
        while (!q.empty()) {
            int x = q.front().first;
            int y = q.front().second;
            q.pop();
            for(int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (nx < 0 || nx >= xlen || ny < 0 || ny >= ylen)
                    continue;
                if (!visited[nx][ny] && maps[nx][ny] != 'X') {
                    visited[nx][ny] = true;
                    q.push(make_pair(nx, ny));
                    cnt += maps[nx][ny] - '0';
                }
            }
        }
        return cnt;
    }
    
    vector<int> solution(vector<string> maps) {
        vector<int> answer;
        xlen = maps.size();
        ylen = maps[0].size();
    
        for(int i = 0; i < xlen; i++) {
            for(int j = 0; j < ylen; j++) {
                if (!visited[i][j] && maps[i][j] != 'X') {
                    visited[i][j] = true;
                    answer.push_back(bfs(maps, i, j));
                }
            }
        }
        if (answer.size() == 0)
            answer.push_back(-1);
        else 
            sort(answer.begin(), answer.end());
        return answer;
    }

     

    * 상하좌우를 나타내기 위한 dx와 dy 배열, 2차원 배열의 가로 크기와 세로 크기를 나타내는 xlen, ylen

      방문유무를 판단하기 위한 visited배열을 선언했습니다

    * BFS를 사용해 풀이

    * (0, 0)부터 (xlen, ylen)까지 한 칸씩 이동하는데 방문하지 않았고 map의 값이 X가 아닌 숫자가 나오면
      bfs함수를 방문해 최대 머무를 수 있는 날짜를 가져와 answer벡터에 추가합니다

    * bfs함수는 현재 위치에서 상하좌우 값을 확인하고 방문해야 할 곳이 있으면 해당 좌표를 큐에 저장합니다
      더이상 큐에 값이 없을때까지 반복하게 되면 상하좌우로 연결된 하나의 덩어리를 모두 돌게 됩니다

    * 만약 answer벡터가 비어있다면 지낼 수 있는 무인도가 없으므로 -1을 삽입합니다
     그렇지 않다면 오름차순으로 정렬된 answer벡터를 반환해야 하므로 sort함수를 사용해 정렬합니다

    'PROGRAMMERS > C++' 카테고리의 다른 글

    [programmers] [1차] 뉴스 클러스터링_c++  (0) 2024.02.17
    [programmers] 숫자 짝꿍_c++  (0) 2024.02.15
    [programmers] 과일 장수_c++  (0) 2024.02.15

    댓글

Designed by Tistory.