바닥 장식 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;
}
}
}
}
'Algorithm > 코딩테스트' 카테고리의 다른 글
[코딩테스트] 백준 - 상근이의 여행 (0) | 2024.08.01 |
---|---|
[코딩테스트] 백준 - 점프왕 쩰리 (Small) (0) | 2024.08.01 |
[코딩테스트] 백준 - Best Grass (0) | 2024.08.01 |
[코딩테스트] 백준 - 단어 정렬 (0) | 2024.07.31 |
[코딩테스트] 백준 - 신입 사원 (0) | 2024.07.31 |