Coding Test/Java Coding Test
[프로그래머스 / 자바] - 안전지대
nam_ji
2024. 9. 29. 15:52
안전지대 - LV.0
문제
- 정수 2차원 배열 board가 매개변수로 주어집니다.
- n * n 지역이 있습니다.
- 지뢰가 있는 지역과 지뢰에 인접한
- 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
- board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
- 안전한 지역의 칸 수를 출력하는 문제입니다.
테스트 (인텔리제이)
- board는 n * n 배열이라는 제한사항이 있기 때문에 answer를 n * n으로 초기화를 해줍니다.
- danger라는 문자열 배열을 선언하는데 여기서는 Set 인터페이스를 사용할 생각입니다.
- danger에는 1과 근접한 배열의 번호를 저장하고 마지막에 answer에서 danger를 빼주면 안전지대를 구할 수 있기 때문이고 Set을 쓴다면 중첩되는 부분을 지울 수 있기 떄문입니다. (Set은 원소의 중복 데이터를 제거해줍니다.)
- 2차원 배열 board의 크기만큼 반복하는 이중 for문을 이용하여 board의 1을 찾도록 합니다.
- if문으로 board의 원소에서 1을 만난다면
- danger에 해당 원소의 인덱스를 추가하도록 합니다. 여기서 해당 인덱스 번호는 이차원 배열이기 때문에 숫자가 두개 나와 더해서 저장하면 안되기 때문에 danger를 문자열 배열로 선언하고 각각 인덱스 번호를 문자열로 변환하고 더해주도록 했습니다.
- 이제 if문으로 1과 근접한 지역이 board의 범위를 벗어나고 있는지 아닌지를 확인하고 danger에 해당 인덱스 번호를 추가해주면 됩니다.
- 마지막으로 answer에서 danger를 뺐을 때 0보다 큰 값이라면 answer에 해당 값을 저장하여 출력하고
- 아니라면 0을 저장하고 출력하도록 하면 해결할 수 있습니다.
package com.example.codingtest;
import java.util.*;
public class 안전지대 {
public static void main(String[] args) {
/*
정수 2차원 배열 board가 매개변수로 주어집니다.
n * n 지역이 있습니다.
지뢰가 있는 지역과 지뢰에 인접한
위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
안전한 지역의 칸 수를 출력하는 문제입니다.
제한사항
- board는 n * n 배열입니다.
- 1 ≤ n ≤ 100
- 지뢰는 1로 표시되어 있습니다.
- board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
입출력 예
board
[
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 0, 0, 0}
]
[
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 1, 1, 0},
{0, 0, 0, 0, 0}
]
[
{1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1}
]
result
16
13
0
입출력 설명
#1
(3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과
지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다.
따라서 16을 return합니다.
#2
(3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과
지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다.
따라서 위험지역을 제외한 칸 수 13을 return합니다.
#3
모든 지역에 지뢰가 있으므로 안전지역은 없습니다.
따라서 0을 return합니다.
*/
int[][] board = {
{1, 0, 0},
{0, 0, 0},
{0, 0, 0}
};
int n = board.length;
int answer = n * n;
Set<String> danger = new HashSet<>();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
if (board[i][j] == 1) {
danger.add(i + "" + j);
if (i - 1 >= 0 && j - 1 >= 0) {
danger.add((i - 1) + "" + (j - 1)); // 좌상
}
if (i - 1 >= 0) {
danger.add((i - 1) + "" + j); // 상
}
if (i - 1 >= 0 && j + 1 < n) {
danger.add((i - 1) + "" + (j + 1)); // 우상
}
if (j - 1 >= 0) {
danger.add(i + "" + (j - 1)); // 좌
}
if (j + 1 < n) {
danger.add(i + "" + (j + 1)); // 우
}
if (i + 1 < n && j - 1 >= 0) {
danger.add((i + 1) + "" + (j - 1)); // 좌하
}
if (i + 1 < n) {
danger.add((i + 1) + "" + j); // 하
}
if (i + 1 < n && j + 1 < n) {
danger.add((i + 1) + "" + (j + 1)); // 우하
}
}
}
}
if (answer - danger.size() > 0) {
answer = answer - danger.size();
} else {
answer = 0;
}
System.out.println(answer);
}
}
프로그래머스 코드
import java.util.*;
class Solution {
public int solution(int[][] board) {
int n = board.length;
int answer = n * n;
Set<String> danger = new HashSet<>();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
if (board[i][j] == 1) {
danger.add(i + "" + j);
if (i - 1 >= 0 && j - 1 >= 0) {
danger.add((i - 1) + "" + (j - 1)); // 좌상
}
if (i - 1 >= 0) {
danger.add((i - 1) + "" + j); // 상
}
if (i - 1 >= 0 && j + 1 < n) {
danger.add((i - 1) + "" + (j + 1)); // 우상
}
if (j - 1 >= 0) {
danger.add(i + "" + (j - 1)); // 좌
}
if (j + 1 < n) {
danger.add(i + "" + (j + 1)); // 우
}
if (i + 1 < n && j - 1 >= 0) {
danger.add((i + 1) + "" + (j - 1)); // 좌하
}
if (i + 1 < n) {
danger.add((i + 1) + "" + j); // 하
}
if (i + 1 < n && j + 1 < n) {
danger.add((i + 1) + "" + (j + 1)); // 우하
}
}
}
}
if (answer - danger.size() > 0) {
answer = answer - danger.size();
} else {
answer = 0;
}
return answer;
}
}