안전지대
날짜 | 2023-10-08 |
사용 언어 | Java |
문제 유형 | IF문, 반복문, 배열 |
정답률 | 59% |
문제 URL | 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만 존재합니다.
나의 풀이 #
//정보처리기사 실기 22년 3회 문제(c언어) 기반 풀이
class Solution {
public int solution(int[][] board) {
int n = board.length;
int[][] warn = new int[n][n];
//전체 board를 돌며 지뢰가 있는 경우를 찾는다.
for(int y = 0; y<n; y++) {
for(int x = 0; x<n; x++) {
if(board[y][x] == 0) continue;
//지뢰가 있는 곳 기준으로 x,y좌표가 -1~1일경우 카운트
for(int i = y-1; i<=y+1; i++) {
for(int j = x-1; j<=x+1; j++) {
//0,0과 같이 배열의 끝에 지뢰가 있을 경우의 out of bounds 에러를 대비
if(i>=0 && i<n && j>=0 && j<n) {
warn[i][j] += 1;
}
}
}
}
}
// warn배열중 값이 0일 경우 안전지역
int answer = 0;
for(int[] y : warn) {
for(int safe : y) {
if(safe==0) answer++;
}
}
/*
출력 테스트
System.out.println("board(warn)");
for(int i = 0; i<n; i++) {
for(int j = 0; j<n; j++) {
System.out.print(" "+board[i][j]+"("+warn[i][j]+") |");
}
System.out.println();
}
*/
return answer;
}
}
다른 사람의 풀이 #
class Solution {
public int solution(int[][] board) {
int answer = 0;
int length = board.length; //길이
int[][] temp = new int[length+2][length+2];
// 길이를 2 늘린 액자용 배열 생성 -> 이러면 단순한 조건식으로 안전영역 구할 수 있음
// 액자에 board 이식.
for(int i=1; i<length+1; i++){
for(int j=1; j<length+1;j++){
temp[i][j]=board[i-1][j-1];
}
}
//위험지대 찾기
for(int i=1; i<length+1; i++){
for(int j=1; j<length+1;j++){
if(temp[i][j]==1){
for(int a = i-1; a<=i+1; a++){
for(int b =j-1; b<=j+1; b++){
if(temp[a][b]!=1) temp[a][b]=2;
}
}
}
}
}
// 안전지대 카운트
for(int i=1; i<length+1; i++){
for(int j=1; j<length+1;j++){
if(temp[i][j]==0) answer++;
System.out.print(temp[i][j]);
}
System.out.println("");
}
return answer;
}
}
관련개념 학습 #
정보 처리 기사 2022 3회 실기 복원 문제