2025. 8. 10. 21:38ㆍCoding Test (Algorithm)/JAVA

코딩 테스트를 공부하고 있습니다📝 틀리거나 다른 부분이 있을 수 있습니다.
Quiz
Solution(Private)
새로운 시각을 배울 수 있던 문제였다.
핵심 포인트는 다음과 같다.
1. 지뢰를 발견한 지역(a,b)를 기준으로 하여, 위험 지대는 다음으로 분류될 수 있다.
(a-1, b-1) (a-1, b) (a-1, b+1) (a, b-1) (a, b+1) (a+1, b-1), (a+1, b) (a+1, b+1)
2. 지뢰와 위험 지대를 제외한 곳이 안전 지대이다.
이중 for문을 통해 지뢰 위치를 찾고, 지뢰 위치인 경우 추가로 for문을 이용하여 안전 지대를 위험 지대로 바꾸면 된다. 이후 지뢰(1) 지역이나 위험 지역(편의상, 2)을 제외한 곳이 안전 지대라고 판단하여, 위치를 찾으면 된다.
그렇게 문제를 풀어가다가, 프로그래머스 답을 보고 깨닫게 되었다. 왜 찾는 지역을 주어진 지역으로만 한정했을까...? 이렇게 되면, 추가 메서드를 만들어서, x 또는 y 좌표가 0인지 확인해야 하는 불편함이 있었다. 따라서 해당 불편함을 해결하고자 한다면, 가상의 지역을 만들면 되는 것이다. (기존에 제공된 지역보다 가로, 세로가 각각 2씩 커진다)
그래서 정리한 핵심 포인트는 다음과 같다.
1. 지뢰(1) 주변 8방향(상·하·좌·우·대각선)을 위험 지대로 표시한다.
2. 지뢰(1)와 위험 지대(2)를 제외한 나머지 칸이 안전 지대다.
3. 경계 체크를 하지 않기 위해, 보드보다 더 큰 임시 보드(zone)으로 확장한다.
아래는 프로그래머스 답변을 참고하여 작성된 코드이다. 배울점이 많은 문제였다.
class Solution {
public int solution(int[][] board) {
int answer = 0;
int length = board.length;
int[][] zone = new int[length+2][length+2];
for(int i = 1; i < length+1; i++) {
for (int j = 1; j < length+1; j++) {
zone[i][j] = board[i-1][j-1];
}
}
for(int i = 1; i < length+1; i++) {
for(int j = 1; j < length+1; j++) {
if(zone[i][j] == 1) {
for(int a = i-1; a<=i+1; a++){
for(int b =j-1; b<=j+1; b++){
if(zone[a][b]!=1) zone[a][b]=2;
}
}
}
}
}
for(int i = 1; i < length+1; i++) {
for(int j = 1; j < length+1; j++) {
if(zone[i][j] == 0) {
answer++;
}
}
}
return answer;
}
}
'Coding Test (Algorithm) > JAVA' 카테고리의 다른 글
| [프로그래머스] 크기가 작은 문자열 (0) | 2025.12.13 |
|---|---|
| [프로그래머스] 없는 숫자 더하기 (0) | 2025.08.12 |
| [프로그래머스] 구슬을 나누는 경우의 수 (4) | 2025.08.10 |
| [백준] 11382번 - 꼬마 정민 (1) | 2025.08.03 |
| [프로그래머스] 치킨 쿠폰 (0) | 2025.02.23 |