알고리즘/백준 문제풀이
백준 [자바 java] 2468번 : 안전거리
잔디🌿
2022. 8. 2. 19:31
쉬운 문제이긴 했지만 문제를 이해하기가 쫌 어려웠어요ㅜ 다른 분 블로그 보고 이해를 했습니다. 위, 아래, 오른쪽 혹은 왼쪽이라고 해서 위아래는 있어야 하고 왼쪽 오른쪽이 옵션 같은 것인 줄 알았는데 한마디로 잠기지 않는 땅의 덩어리 개수를 구하라는 이야기입니다.
import java.io.*;
import java.util.*;
class Main {
static int[][] vis;
static int n;
static void check( int i, int j, int dd) {
if(i-1>=1&&vis[i-1][j] == 0) {
vis[i-1][j] = dd;
check(i-1,j,dd);
}
if(i+1<=n&&vis[i+1][j] == 0) {
vis[i+1][j] = dd;
check(i+1,j,dd);
}
if(j-1>=1&&vis[i][j-1] == 0) {
vis[i][j-1] = dd;
check(i,j-1,dd);
}
if(j+1<=n&&vis[i][j+1] == 0) {
vis[i][j+1] = dd;
check(i,j+1,dd);
}
}
public static void main(String[] arg) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader (System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine());
int[][] arr = new int[n+1][n+1];
vis = new int[n+1][n+1];
int cnt = 0;
int max1 = 0;
int i;
int j;
for(i = 1;i<=n;i++) {
st = new StringTokenizer(br.readLine());
for(j = 1;j<=n;j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
max1 = Math.max(max1,arr[i][j]);
}
}
int k;
int dd;
int max = 1;
for(i = 0;i<=max1;i++) {
dd = 2;
cnt = 0;
for(j = 1;j<=n;j++) {
for(k = 1;k<=n;k++) {//잠기는 구역
if(arr[j][k] <=i) {
vis[j][k] = 1;
}
else {
vis[j][k] = 0;
}
}
}
for(j = 1;j<=n;j++) {
for(k = 1;k<=n;k++) {
if(vis[j][k] == 0) {
vis[j][k] = dd;
check(j,k,dd);
dd++;
}
}
}
max = Math.max(max, dd);
}
System.out.println(max-2);
}
}
처음에 arr에 입력 받고, 0부터 arr의 최댓값까지 차례로 비가 온다고 가정했을 때의 덩어리 중 가장 큰 수를 출력하도록 했어요. vis에 0을 저장했다가 비가 와서 잠기는 땅은 1을 넣어주었고, 다시 vis [1][1]부터 잠기지 않은 땅은 check 함수를 호출해 같은 덩어리인 땅에는 같은 수가 들어가게 설계했습니다.
실수 1. vis이 들어갈 자리에 arr이 들어가게 했다.
실수 2. 마지막에 max 에서 2를 뺀 값을 넣어야 하는데 1을 뺀 값을 넣었다.
기억할 점: 어떤 배열을 써야 할 지 주의하기.
다른 사람의 코드와 다른 점 : 딱히 없다.