[코딩테스트] 23/12/12 - 무인도 여행 (Level2)
문제 설명
메리는 여름을 맞아 무인도로 여행을 가기 위해 지도를 보고 있습니다. 지도에는 바다와 무인도들에 대한 정보가 표시돼 있습니다. 지도는 1 x 1크기의 사각형들로 이루어진 직사각형 격자 형태이며, 격자의 각 칸에는 ‘X’ 또는 1에서 9 사이의 자연수가 적혀있습니다. 지도의 ‘X’는 바다를 나타내며, 숫자는 무인도를 나타냅니다. 이때, 상, 하, 좌, 우로 연결되는 땅들은 하나의 무인도를 이룹니다. 지도의 각 칸에 적힌 숫자는 식량을 나타내는데, 상, 하, 좌, 우로 연결되는 칸에 적힌 숫자를 모두 합한 값은 해당 무인도에서 최대 며칠동안 머물 수 있는지를 나타냅니다. 어떤 섬으로 놀러 갈지 못 정한 메리는 우선 각 섬에서 최대 며칠씩 머물 수 있는지 알아본 후 놀러갈 섬을 결정하려 합니다.
지도를 나타내는 문자열 배열 maps가 매개변수로 주어질 때, 각 섬에서 최대 며칠씩 머무를 수 있는지 배열에 오름차순으로 담아 return 하는 solution 함수를 완성해주세요. 만약 지낼 수 있는 무인도가 없다면 -1을 배열에 담아 return 해주세요.
제한사항
- 3 ≤
maps의 길이 ≤ 100- 3 ≤
maps[i]의 길이 ≤ 100 maps[i]는 ‘X’ 또는 1 과 9 사이의 자연수로 이루어진 문자열입니다.- 지도는 직사각형 형태입니다.
- 3 ≤
문제풀이
- BFS를 사용하여 문제 풀이하였습니다.
- visited 배열로 방문여부를 판단합니다.
참고할 문서
코드 (C++)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
int BFS(vector<string> maps, vector<vector<bool>>& visited, int y, int x)
{
int dr[] = {1, -1, 0, 0};
int dc[] = {0, 0, 1, -1};
queue<pair<int, int>> q;
q.emplace(x, y);
visited[x][y] = true;
int countDay = 0;
while (!q.empty())
{
pair<int, int> temp = q.front();
q.pop();
countDay += maps[temp.second][temp.first] - '0';
for (int index = 0; index < 4; ++index)
{
int nx = temp.first + dr[index];
int ny = temp.second + dc[index];
if (ny >= maps.size() || ny < 0 || nx >= maps[ny].size() || nx < 0)
continue;
if (visited[nx][ny] || maps[ny][nx] == 'X')
continue;
visited[nx][ny] = true;
q.emplace(nx, ny);
}
}
return countDay;
}
vector<int> solution(vector<string> maps) {
vector<int> answer;
vector<vector<bool>> visited(maps[0].size(), vector<bool>( maps.size(), false));
for (int y = 0; y < maps.size(); ++y)
{
for (int x = 0; x < maps[y].size(); ++x)
{
//바다임
if (maps[y][x] == 'X' || visited[x][y])
continue;
answer.push_back(BFS(maps, visited, y, x));
}
}
if (answer.empty())
answer.push_back(-1);
reverse(answer.begin(), answer.end());
return answer;
}
This post is licensed under CC BY 4.0 by the author.