반응형
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
지도를 나타낸는 문자열 maps가 매개변수로 주어질 때, 각 섬에서 최대 며칠씩 머무를 수 있는지 배열에 오름차순으로 담아 return 하는 solution 함수를 완성해주세요.
result : [1, 1, 27]
풀이 방법
BFS나 DFS를 이용해서 연결되어 있는 섬을 찾은 후
연결된 섬들의 머물 수 있는 시간을 배열에 담아줍니다.
이후 정렬하여 반환하여 마무리합니다.
BFS 코드
int dy[4] = {1, -1, 0, 0};
int dx[4] = {0, 0, 1, -1};
int BFS(vector<string>& maps, vector<vector<bool>>& visited, int y, int x)
{
int ret = 0;
queue<pair<int, int>> q;
visited[y][x] = true;
q.push({y, x});
while(!q.empty())
{
auto [cy, cx] = q.front(); q.pop();
ret += maps[cy][cx] - '0';
for (int i = 0; i < 4; i++)
{
auto [ny, nx] = make_pair(cy + dy[i], cx + dx[i]);
// 배열 범위를 넘어갔거나, 이미 방문을 했거나, X라면 continue
if (ny < 0 || ny >= visited.size() || nx < 0 || nx >= visited[ny].size()
|| visited[ny][nx] || maps[ny][nx] == 'X')
continue;
visited[ny][nx] = true;
q.push({ny, nx});
}
}
return ret;
}
solution 코드
vector<int> solution(vector<string> maps) {
vector<int> answer;
vector<vector<bool>> visited(maps.size(), vector<bool>(maps[0].size()));
// X가 아니면서 방문하지 않은 섬을 기준으로 체크
for (int i = 0; i < maps.size(); i++)
{
for (int j = 0; j < maps[i].size(); j++)
{
if (visited[i][j] || maps[i][j] == 'X')
continue;
answer.push_back(BFS(maps, visited, i, j));
}
}
// 연결된 섬에서 머물 수 있는 시간들을 정렬
sort(answer.begin(), answer.end());
// 머물 수 있는 섬이 없다면 -1을 추가
if (answer.size() == 0)
answer.push_back(-1);
return answer;
}
반응형
LIST
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
프로그래머스 귤 고르기 [Lv. 2] (C++) (0) | 2025.01.06 |
---|---|
프로그래머스 마법의 엘리베이터 [Lv. 2] (C++) (0) | 2025.01.05 |
프로그래머스 리코쳇 로봇 [Lv. 2] (C++) (0) | 2024.12.30 |
프로그래머스 호텔 대실 [Lv. 2] (C++) (0) | 2024.12.29 |
프로그래머스 숫자의 표현 [Lv. 2] (0) | 2024.12.28 |