Algorithm/코딩테스트

[코딩테스트] 백준 - 바닥 장식

jjuya 개발 기록 2024. 8. 1. 21:14

바닥 장식 1388번 [14일차]

시간제한 메모리 제한
2초 128MB

문제

형택이는 건축가이다. 지금 막 형택이는 형택이의 남자 친구 기훈이의 집을 막 완성시켰다. 형택이는 기훈이 방의 바닥 장식을 디자인했고, 이제 몇 개의 나무 판자가 필요한지 궁금해졌다. 나무 판자는 크기 1의 너비를 가졌고, 양수의 길이를 가지고 있다. 기훈이 방은 직사각형 모양이고, 방 안에는 벽과 평행한 모양의 정사각형으로 나누어져 있다.

이제 ‘-’와 ‘|’로 이루어진 바닥 장식 모양이 주어진다. 만약 두 개의 ‘-’가 인접해 있고, 같은 행에 있다면, 두 개는 같은 나무 판자이고, 두 개의 ‘|’가 인접해 있고, 같은 열에 있다면, 두 개는 같은 나무 판자이다.

기훈이의 방 바닥을 장식하는데 필요한 나무 판자의 개수를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 방 바닥의 세로 크기N과 가로 크기 M이 주어진다. 둘째 줄부터 N개의 줄에 M개의 문자가 주어진다. 이것은 바닥 장식 모양이고, '-‘와 ’|‘로만 이루어져 있다. N과 M은 50 이하인 자연수이다.

 

출력

첫째 줄에 문제의 정답을 출력한다.

 

나의코드

package day14;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

// 바닥 장식 - 1388번
public class Solution2 {
    static boolean[][] visited;

    static int X;
    static int Y;

    static int count;
    // 방문 체크 확인

    public static void main(String[] args) throws IOException {
        // - 가 가로로 연달아 있을 경우 하나로 침
        // | 가 세로로 연달아 있을 경우 하나로 침
        // dsf 사용

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stNum = new StringTokenizer(br.readLine());
        X = Integer.parseInt(stNum.nextToken());
        Y = Integer.parseInt(stNum.nextToken());

        String[][] tile = new String[X][Y];
        visited  = new boolean[X][Y];

        count=0;

        // 입력받은 문자 배열에 넣어주기
        for(int i = 0;i<X;i++){
            String line = br.readLine();
            for(int j=0;j<line.length();j++){
                String c = String.valueOf(line.charAt(j));
                tile[i][j] = c;
            }
        }

        for(int i = 0;i<X;i++){
            for(int j=0;j<Y;j++){
                if(!visited[i][j]){
                    dfs(i,j, tile);
                }
            }
        }

        System.out.println(count);
    }

    static void dfs(int x, int y, String[][] tile){
        visited[x][y] = true;
        // 방문확인

        // - y확인
        // 확인하려고 하는 순번이 (0,0)일경우
        // -는 옆에 있는 곳을 확인해야하기 떄문에
        // (0,1)확인 x,y중 y값을 +1 해서 확인
        if(tile[x][y].equals("-")){
            // y값이 배열의 마지막번호일경우
            // 더이상 갈곳이 없기 때문에 +1 해주기
            if(y == Y-1){
                count++;
                return;
            }

            // 방문 배열이 false이고, 옆칸의 문자가 - 일 경우 계속 탐색
            if(!visited[x][y+1] && tile[x][y + 1].equals("-")){
                dfs(x,y+1, tile);
            }else {
                count++;
                return;
            }
        }

        // | x확인
        if(tile[x][y].equals("|")) {
            if (x == X-1) {
                count++;
                return;
            }

            if (!visited[x + 1][y] && tile[x + 1][y].equals("|")) {
                dfs(x + 1, y, tile);
            } else {
                count++;
                return;
            }
        }
    }

}