728x90
SMALL
백준 문제 풀이: 1388 [바닥 장식]
문제 링크: https://www.acmicpc.net/problem/1388
문제 설명:
바닥 장식의 크기가 N×M 크기이고, 각 위치에는 '-' 또는 '|'로 표시된 장식이 배치되어 있습니다. 연결된 동일한 모양의 장식은 하나의 나무 판자로 구성됩니다. 나무 판자의 개수를 구하는 프로그램을 작성하세요.
입력 조건:
- 첫째 줄에 N과 M이 주어집니다. (1 ≤ N, M ≤ 50)
- 둘째 줄부터 N개의 줄에 M개의 문자가 주어집니다. ('-' 또는 '|')
출력 조건:
- 바닥 장식을 채우는 나무 판자의 개수를 출력합니다.
문제 해결 코드
#include <iostream>
#include <queue>
#include <string>
using namespace std;
int arr[51][51]; // 바닥 장식 저장 (0: '-', 1: '|')
int visited[51][51]; // 방문 여부 확인
int dx[4] = { 1, -1, 0, 0 }; // 상하좌우 이동
int dy[4] = { 0, 0, 1, -1 };
int cnt = 0; // 나무 판자의 개수
int n, m;
void bfs(int x, int y) {
queue<pair<int, int>> q;
q.push({ x, y });
visited[x][y] = 1;
while (!q.empty()) {
int nx = q.front().first;
int ny = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int kx = nx + dx[i];
int ky = ny + dy[i];
// 경계를 벗어나는 경우
if (kx < 0 || ky < 0 || kx >= n || ky >= m) continue;
// 이미 방문한 경우
if (visited[kx][ky]) continue;
// '-' 모양이 가로로 연결된 경우
if (arr[nx][ny] == 0 && arr[kx][ky] == 0 && (i == 2 || i == 3)) {
visited[kx][ky] = 1;
q.push({ kx, ky });
}
// '|' 모양이 세로로 연결된 경우
if (arr[nx][ny] == 1 && arr[kx][ky] == 1 && (i == 0 || i == 1)) {
visited[kx][ky] = 1;
q.push({ kx, ky });
}
}
}
}
int main() {
cin >> n >> m;
string s;
for (int i = 0; i < n; i++) {
cin >> s;
for (int j = 0; j < s.size(); j++) {
arr[i][j] = (s[j] == '-') ? 0 : 1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (!visited[i][j]) {
cnt++;
bfs(i, j);
}
}
}
cout << cnt << endl;
return 0; // 프로그램 정상 종료
}
코드 설명
위 코드는 BFS를 사용하여 연결된 '-' 또는 '|' 모양의 바닥 장식을 하나의 나무 판자로 간주하고 이를 계산합니다.
- 입력 처리:
- `arr[i][j]`에 '-'는 0, '|'는 1로 저장합니다.
- BFS 탐색:
- 방문하지 않은 위치에서 BFS를 시작하여 연결된 동일한 모양의 바닥 장식을 모두 방문합니다.
- 연결된 '-'는 가로 방향(i == 2, i == 3), 연결된 '|'는 세로 방향(i == 0, i == 1)만 탐색합니다.
- 나무 판자 개수:
- 새로운 BFS 탐색을 시작할 때마다 `cnt`를 증가시킵니다.
시간 복잡도 분석:
- BFS 탐색은 각 위치를 한 번만 방문하므로 O(N × M).
전체 시간 복잡도는 O(N × M)로 효율적으로 처리 가능합니다.
결과
다음은 입력 예시와 출력 결과입니다:
입력:
4 4
-||-
|--|
-||-
|--|
출력:
8
입력된 바닥 장식에서 연결된 '-' 또는 '|'는 각각 하나의 나무 판자로 간주되어 총 8개의 나무 판자가 필요합니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 그래프' 카테고리의 다른 글
백준 2665번 [미로만들기](C++) -yes6686- 티스토리 (1) | 2024.01.27 |
---|---|
백준 4485번 [녹색 옷 입은 애가 젤다지?](C++) -yes6686- 티스토리 (1) | 2024.01.27 |
백준 14938번 [서강그라운드](C++) -yes6686- 티스토리 (1) | 2024.01.25 |
백준 4179번 [불!](C++) -yes6686- 티스토리 (0) | 2024.01.24 |
백준 9019번 [DSLR](C++)-yes6686- 티스토리 (0) | 2024.01.14 |