백준 Baekjoon

[C언어] 백준 1388 : 바닥 장식

sujo 2022. 10. 3. 08:08

백준 1388 : 바닥 장식

 

문제 링크

https://www.acmicpc.net/problem/1388

 

1388번: 바닥 장식

형택이는 건축가이다. 지금 막 형택이는 형택이의 남자 친구 기훈이의 집을 막 완성시켰다. 형택이는 기훈이 방의 바닥 장식을 디자인했고, 이제 몇 개의 나무 판자가 필요한지 궁금해졌다. 나

www.acmicpc.net

 

 

문제 내용

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

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

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

 

 

Idea

1. '-' 일 때, 같은 행에 있다면 한 나무판자이다.

2. '|' 일 때, 같은 열에 있다면 한 나무판자이다.

 

단순히 조건에 따라 행이나 열을 검사하여 총 판자의 개수를 세면 된다.

 

(후기)

심심풀이로 dfs에 있는 쉬운 문제 골라서 한 거였는데 여타 그래프 탐색 알고리즘이 딱히 필요가 없어서 진짜 이게 맞나..? 이렇게 단순해..? 하면서 풀었다.

 

 

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
 
char map[51][51];
int n, m;
 
void verti(int x, int y) {
    for (int i = x; i < n; i++) {
        if (map[i][y] != '|'break;
        map[i][y] = '.';
    }
}
 
void hori(int x, int y) {
    for (int j = y; j < m; j++) {
        if (map[x][j] != '-'break;
        map[x][j] = '.';
    }
}
 
int main() {
    scanf("%d %d"&n, &m);
 
    // input
    for (int i = 0; i < n; i++)
        scanf("%s", map[i]);
 
    // 전체 map 순회
    int result = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (map[i][j] == '|') {
                verti(i, j);
                result++;
            }
            if (map[i][j] == '-') {
                hori(i, j);
                result++;
            }
        }
    }
 
    // output
    printf("%d\n", result);
    return (0);
}
cs

 

 

'백준 Baekjoon' 카테고리의 다른 글

[C언어] 백준 2011 : 암호코드  (3) 2022.11.26
[C++] 백준 2512 : 예산  (0) 2022.02.28
[C언어] 백준 1010 : 다리 놓기  (0) 2022.01.30
[C++] 백준 23057 : 도전 숫자왕  (8) 2021.09.19
[C++] 백준 16953 : A → B  (6) 2021.07.27