알고리즘 자료구조/프로그래머스
[프로그래머스] 안전지대
yes_truly
2024. 3. 21. 00:02
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/120866
🖊️문제
문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
제한사항
- board는 n * n 배열입니다.
- 1 ≤ n ≤ 100
- 지뢰는 1로 표시되어 있습니다.
- board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
🖊️문제 풀이
폭탄이 있는 위치 기준으로 위, 아래, 좌, 우, 대각선 방향이 위험지역에 해당하니까
dx = {1,0,-1,0,1,1,-1,-1}
dy = {0,1,0,-1,1,-1,1,-1}
의 여덟 방향을 확인하면서 해당 지역이 위험 지역인지를 표기해준다.
표기해주고 나서 board[i][j]==1이면 위험 지역, 0이면 위험지역이 아닌 지역이니까 안전한 지역 수 +1해줘서 안전한 지역의 칸 수를 계산해준다.
이 문제를 보고서 바로 든 생각은 "BFS나 DFS푸는 방식이랑 유사하게 풀면 되겠구나!"이다.
전체를 다 탐색할 필요가 없고, 딱 8방향만 체크해주면 되니까 BFS랑 유사하게 큐를 사용하여 문제를 풀어보았다.
🖊️코드
package 프로그래머스Lv0;
import java.util.LinkedList;
import java.util.Queue;
public class 안전지대 {
public int solution(int[][] board) {
int answer = 0;
int[] dx = {0,1,-1,0,-1,1,1,-1};
int[] dy = {1,0,0,-1,-1,1,-1,1};
Queue<int[]> queue = new LinkedList<>();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if(board[i][j] == 1){
queue.add(new int[]{i,j});
}
}
}
while (!queue.isEmpty()){
int[] cur = queue.remove();
for (int i = 0; i < dx.length; i++) {
int x = cur[0]+dx[i];
int y = cur[1]+dy[i];
if(x<0 || y<0 || x>=board.length || y>=board.length){
continue;
}
board[x][y] = 1;
}
}
for(int[] cur : board){
for(int item : cur){
if(item==0){
answer++;
}
}
}
return answer;
}
}
이렇게 BFS 문제 푸는 방식이랑 유사하게!!
728x90