728x90
더보기
#include<iostream>
#include<vector>
using namespace std;
int x, y;
vector<vector<char>> map;
vector<vector<bool>> visited;
int dfs(int i, int j) {
visited[i][j] = true;
if (map[i][j] == '|') {
if (i + 1 == x || map[i + 1][j] != '|') return 1;
return dfs(i + 1, j);
}
else if (map[i][j] == '-') {
if (j + 1 == y || map[i][j + 1] != '-') return 1;
return dfs(i, j + 1);
}
return 0;
}
int main() {
cin >> x >> y;
char tile;
map = vector<vector<char>>(x, vector<char>(y, 'o'));
visited = vector<vector<bool>>(x, vector<bool>(y, false));
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
cin >> tile;
map[i][j] = tile;
}
}
int cnt = 0;
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
if (!visited[i][j]) cnt += dfs(i, j);
}
}
cout << cnt << endl;
}
문제
https://www.acmicpc.net/problem/1388
1388번: 바닥 장식
형택이는 건축가이다. 지금 막 형택이는 형택이의 남자 친구 기훈이의 집을 막 완성시켰다. 형택이는 기훈이 방의 바닥 장식을 디자인했고, 이제 몇 개의 나무 판자가 필요한지 궁금해졌다. 나
www.acmicpc.net
728x90
[접근]
DFS 연습용으로 찾았기 때문에 무조건 DFS로 풀려고 생각했다.
DFS
https://jolly-note.tistory.com/62
DFS (Depth First Search, 깊이 우선 탐색)
접근 graph 또는 tree를 탐색하는 알고리즘이다. 특정 노드부터 시작하여 최대한 멀리 갈 수 있을만큼 진행한다. 바로 전 분기점까지 돌아가고 아직 방문하지 않은 다음 노드로 진행한다. (방문한
jolly-note.tistory.com
[접근1]
값을 불러와서 저장하는 작업.
map과 visited를 초기화를 먼저 시켜주고 map에 값을 넣어줬다.
map, visited, x, y는 전역변수이다.
cin >> x >> y;
char tile;
map = vector<vector<char>>(x, vector<char>(y, 'o'));
visited = vector<vector<bool>>(x, vector<bool>(y, false));
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
cin >> tile;
map[i][j] = tile;
}
}
[접근2]
visited 전체를 돌면서 아직 방문하지 않았다면 dfs를 수행해준다.
dfs의 리턴값은 int로 해서 cnt값을 바로 증가시켜줄 수 있도록 했다.
int cnt = 0;
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
if (!visited[i][j]) cnt += dfs(i, j);
}
}
[접근3]
visited를 true로 바꿔주고 map[i][j]가 '|'일 때는 마지막 행이거나 다음 행이 '|'이 아니면 1을 리턴해주고
아니면 다음 행의 dfs를 리턴해준다.
'-'인 경우에도 마찬가지로 비슷하게 수행된다.
int dfs(int i, int j) {
visited[i][j] = true;
if (map[i][j] == '|') {
if (i + 1 == x || map[i + 1][j] != '|') return 1;
return dfs(i + 1, j);
}
else if (map[i][j] == '-') {
if (j + 1 == y || map[i][j + 1] != '-') return 1;
return dfs(i, j + 1);
}
return 0;
}728x90
'coding > algorithm' 카테고리의 다른 글
| [백준/baekjoon] Silver3 2606. 바이러스 (0) | 2022.05.23 |
|---|---|
| [SW Expert Academy] D3 1244. 최대 상금 (0) | 2022.05.23 |
| [SW Expert Academy] D1 2071. 평균값 구하기(c++) (0) | 2022.05.20 |
| [programmers] Lv.2 124 나라의 숫자(c++) (0) | 2022.05.19 |
| [programmers] Lv.1 없는 숫자 더하기(c++) (0) | 2022.05.19 |
댓글