https://school.programmers.co.kr/learn/courses/30/lessons/120866
입문 문제 다 끝내 놓고 진도 나가려고 입문 문제 풀고 있는데
4문제 정도 남겨 놓으니 손을 못 댈 정도다.
시도해 볼 수는 있다. 시도해 볼 수는 있는데!
해당 안전지대 문제 내 다른 사람의 풀이에 나오는 코드가 좋은 코드라고 생각지 않는다.
내가 생각했던 풀이 방법도 베스트라 생각지 않고.
그래서 이 문제는 GPT로 풀었고 이런 식의 접근 방법을 다음에 또 기억하고 싶어 여기에 기록한다.
public class Solution {
public int solution(int[][] board) {
int rows = board.length;
int cols = board[0].length;
boolean[][] danger = new boolean[rows][cols]; // 위험지역을 표시할 배열
// 지뢰 찾기
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (board[i][j] == 1) {
markDangerZone(i, j, danger, rows, cols);
}
}
}
// 안전한 칸 세기
int safeCount = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (board[i][j] == 0 && !danger[i][j]) {
safeCount++;
}
}
}
return safeCount;
}
private void markDangerZone(int x, int y, boolean[][] danger, int rows, int cols) {
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
int newX = x + i;
int newY = y + j;
if (newX >= 0 && newX < rows && newY >= 0 && newY < cols) {
danger[newX][newY] = true;
}
}
}
}
}
배운 점.
1. 와! 진짜로 모든 블록을 다 도는구나! == 돌아야하구나!
2. 지뢰를 찾고, 안전하지 않은 구역을 true로 체크한 다음에 false로 체크된 구역만을 찾아서 return한다.
'코딩테스트 연습' 카테고리의 다른 글
[1차] 비밀지도 (0) | 2024.05.10 |
---|---|
크기가 작은 부분 문자열 (0) | 2024.05.08 |
특이한 정렬 (0) | 2024.05.07 |
외계어 사전 (0) | 2024.05.06 |
최대공약수와 최소공배수 (0) | 2024.05.06 |