-
[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