[Programmers] Lv0 안전지대 Java

2023. 1. 27. 23:57CS/자료구조 & 알고리즘

728x90

문제 출처

[프로그래머스 코딩 테스트 연습]

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

  • 위 아래 왼쪽 오른쪽 대각선은 지뢰가 있는 좌표에 X,Y에 + 1, -1 을 각각 해주면 된다. 하지만 이때 배열에 접근할 때 언더 플로우, 오버 플로우가 발생할 수 있으므로 이에 대한 처리를 해주면된다.
  • 각 지뢰가 있는 것을 1이라고 했을 때 경고하는 것은 0일때 2로 표현을 했다.
  • 위험지역이 아닌 안전지역을 구하는 방법은 위험지역을 표시후 0만 세는 방식으로 하였다.

 

소스 코드

import java.util.Arrays;

public class Solution {

    public int[][] dengerZone(int[][] board, int x, int y) {
        for (int j = Math.max(0, y - 1); j <= Math.min(board.length - 1, y + 1); j++)
            for (int i = Math.max(0, x - 1); i <= Math.min(board.length - 1, x + 1); i++)
                board[j][i] = board[j][i] == 0 ? 2 : board[j][i];

        return board;
    }

    public int solution(int[][] board) {
        for (int y = 0; y < board.length; y++)
            for (int x = 0; x < board.length; x++)
                if (board[y][x] == 1)
                    board = dengerZone(board, x, y);

        return Arrays.stream(board).flatMapToInt(Arrays::stream).map(bordValue -> bordValue == 0 ? 1 : 0).sum();
    }
}
728x90