코딩테스트-알고리즘/백준 BOJ

[백준 BOJ/Silver IV] 1388번 : 바닥 장식

닉네임생각즁 2024. 1. 20. 17:17

 

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;
        }

    }
}