알고리즘 자료구조/프로그래머스

[프로그래머스] 안전지대

yes_truly 2024. 3. 21. 00:02
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/120866

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🖊️문제

문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.


지뢰는 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