https://www.acmicpc.net/problem/1388
1388번: 바닥 장식
형택이는 건축가이다. 지금 막 형택이는 형택이의 남자 친구 기훈이의 집을 막 완성시켰다. 형택이는 기훈이 방의 바닥 장식을 디자인했고, 이제 몇 개의 나무 판자가 필요한지 궁금해졌다. 나
www.acmicpc.net
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int result = 0; // 결과
static int N; // 세로, i
static int M; // 가로, j
static int[][] floor;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
floor = new int[N][M];
for(int i=0; i<N; i++) {
String[] str = sc.next().split("");
for(int j=0; j<str.length; j++) {
if(str[j].equals("-")) floor[i][j] = 0;
else floor[i][j] = 1;
// -는 0으로, |는 1로
}
}
// System.out.println(Arrays.deepToString(floor));
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(floor[i][j] == 0) {
dfs1(i, j); // 0일때
result++;
} else if(floor[i][j] == 1) {
dfs2(i, j); // 1일때
result++;
}
}
}
System.out.println(result);
}
static void dfs1(int x, int y) {
// 0일때(="-"일때) 옆으로만 확인, j+1
floor[x][y] = -1; // 0과 1이 아닌 아예 다른 수로
if(y+1 >= 0 && y+1 < M) {
if(floor[x][y+1] == 0) {
dfs1(x, y+1);
} else return;
}
}
static void dfs2(int x, int y) {
// 1일때(="|"일때) 아래로만 확인, i+1
floor[x][y] = -1; // 0과 1이 아닌 아예 다른 수로
if(x+1 >= 0 && x+1 < N) {
if(floor[x+1][y] == 1) {
dfs2(x+1, y);
} else return;
}
}
}
풀면서 자잘한 실수들이 있었는데 정리하자면
1
String 타입은 equals() 를 이용해서 비교해주어야하는데 == 로 비교해주어서 생각한대로 배열이 만들어지지않았다
알면서도 실수를 반복한다 😥😥
2
문제를 제대로 이해하지 않고 이전 dfs 문제들처럼 상하좌우를 다 비교하며 확인했다
-는 옆으로만 확인하면 되고, |는 아래로만 확인하면 됨!
3
아래처럼 dfs 만들어줄 때 실수가 있었는데
static void dfs1(int x, int y) {
// 0일때(="-"일때) 옆으로만 확인, j+1
floor[x][y] = -1; // 0과 1이 아닌 아예 다른 수로
if(y+1 >= 0 && y+1 < M) {
if(floor[x][y+1] == 0) {
dfs1(x, y+1);
}
}
}
static void dfs2(int x, int y) {
// 1일때(="|"일때) 아래로만 확인, i+1
floor[x][y] = -1; // 0과 1이 아닌 아예 다른 수로
if(x+1 >= 0 && x+1 < N) {
if(floor[x+1][y] == 1) {
dfs2(x+1, y);
}
}
}
같은 숫자가 아니라면 확인을 멈추고 돌아가야하는데 그냥 계속 옆으로 or 밑으로 가면서 확인해주니까 결과가 엄청 커졌다 실수를 깨닫고 else return; 을 추가해줬고 정답이 되었다👍👍
+ 추가
구독자 🖐님이 dfs 메서드는 하나만 만들어도 좋을거같다고 말해줘서 고쳐보았다
나도 처음에 풀 때 생각하긴했으나 뭔가 꼬일거 같아서 두개로 나눴던건데 편하게 하려던 생각이었던거같다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
한 메서드로 합치니까 답이 살짝 다르게 나왔는데 조건 순서를 어떻게 해야할지 생각하면서 침착하게 이것저것 바꿔보니까 성공했다!!!!! 굿굿
그리고 x+1, y+1은 항상 0 이상인게 당연해서 x+1>=0 or y+1>=0 은 조건에서 빼줬다
import java.util.*;
public class Main {
static int result = 0; // 결과
static int N; // 세로, i
static int M; // 가로, j
static int[][] floor;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
floor = new int[N][M];
for(int i=0; i<N; i++) {
String[] str = sc.next().split("");
for(int j=0; j<str.length; j++) {
if(str[j].equals("-")) floor[i][j] = 0;
else floor[i][j] = 1;
// -는 0으로, |는 1로
}
}
// System.out.println(Arrays.deepToString(floor));
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(floor[i][j] == 0 || floor[i][j] == 1) {
dfs(i, j);
result++;
}
}
}
System.out.println(result);
}
static void dfs(int x, int y) {
if(floor[x][y] == 0) {
floor[x][y] = -1; // 0이 아닌 아예 다른 수로
if(y+1 < M && floor[x][y+1] == 0) { // 0일때(="-"일때) 옆으로만 확인, j+1
dfs(x, y+1);
} else return;
}
else if(floor[x][y] == 1) {
floor[x][y] = -1; // 1이 아닌 아예 다른 수로
if (x + 1 < N && floor[x + 1][y] == 1) { // 1일때(="|"일때) 아래로만 확인, i+1
dfs(x + 1, y);
} else return;
}
}
}
'코딩테스트-알고리즘 > 백준 BOJ' 카테고리의 다른 글
[백준 BOJ/Silver V] 2563번 : 색종이 (0) | 2024.01.23 |
---|---|
[백준 BOJ/Gold IV] 1987번 : 알파벳 (0) | 2024.01.21 |
[백준 BOJ/Silver I] 2583번 : 영역 구하기 (0) | 2024.01.20 |
[백준 BOJ/Silver II] 4963번 : 섬의 개수 (0) | 2024.01.18 |
[백준 BOJ/Silver II] 1012번 : 유기농 배추 (0) | 2024.01.18 |