코딩테스트 연습
프로그래머스 코딩테스트 연습 - 무인도 여행 JavaScript
citron031
2023. 6. 25. 15:43
이번 문제는 이차원 배열을 방문하면서, 연결된 유효한 값의 범위와 값을 구하는 문제이다.
기본적으로 dfs방식을 사용하였으며, 방문했는지 확인할 수 있는 값을 설정하여 문제를 해결하였다.
function solution(maps) {
// X는 바다, 숫자는 무인도
// 상하좌우로 연결된 무인도의 숫자의 합은 머물 수 있는 날짜 수
const answer = [];
const checkValid = (x, y) => maps.length - 1 >= x && x >= 0 && maps[x].length - 1 >= y && y >= 0;
const mapDfs = (visited, x, y) => {
// x, y 방문
let sum = parseInt(maps[x][y]);
visited[x][y] = true;
// 상하좌우 이동
if(checkValid(x - 1, y) && !visited[x - 1][y] && maps[x - 1][y] !== 'X') {
sum += parseInt(mapDfs(visited, x - 1, y));
}
if(checkValid(x + 1, y) && !visited[x + 1][y] && maps[x + 1][y] !== 'X') {
sum += parseInt(mapDfs(visited, x + 1, y));
}
if(checkValid(x, y - 1) && !visited[x][y - 1] && maps[x][y - 1] !== 'X') {
sum += parseInt(mapDfs(visited, x, y - 1));
}
if(checkValid(x, y + 1) && !visited[x][ y + 1] && maps[x][y + 1] !== 'X') {
sum += parseInt(mapDfs(visited, x, y + 1));
}
return sum;
}
// 방문 시작
const visited = [];
for(let i = 0; i < maps.length; i++) {
visited.push(new Array(maps[i].length).fill(false));
}
for(let i = 0; i < maps.length; i++) {
for(let j = 0; j < maps[i].length; j++) {
if(!visited[i][j] && maps[i][j] !== 'X') {
answer.push(mapDfs(visited, i, j));
}
}
}
if(answer.length === 0) {
return [-1];
}
return answer.sort((a, b) => a - b);
}
모든 경우의 수를 파악할 수 있도록, 모든 요소에서 확인을 하였다.
다른 사람이 푼 방법을 살펴보았는데, bfs, stack, queue 등 다양한 방법을 사용할 수 있는 것 같았다.
bfs는 개인적으로 약한 부분이라고 생각했기에 이 부분에 대해서 다른 사람의 코드를 보고 배우고자 하였다.