본문 바로가기
코딩테스트 연습

안전지대

by 신재은👩🏼‍💻 2024. 5. 7.

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

 

프로그래머스

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

programmers.co.kr

 

입문 문제 다 끝내 놓고 진도 나가려고 입문 문제 풀고 있는데

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