문제를 어떤 방식으로 해결하려 했는지 그 과정을 적어주세요. 초기에 접근한 방법과 최종 접근이 차이가 없으면 한개만 적어도 됩니다.
위는 그냥 넣어보고 싶어서ㅋ 맹진이가 하는 얘기 들으면서 좀 쓰다가,,, 혼자 머리 또 굴려서?
방문 여부 기록해둘 visited 배열 생성
방문하지 않았는데 배추가 있을 경우
1. cnt값++
2. 상하좌우로 돌면서(충돌 검사 필수) 방문 안 한 배추 있는지 찾아보고
3. 있으면 그 배추 위치 방문 기록해두기
4. 배추가 없다 → 종료
5. 배추 있는데 이미 방문했다 → 종료
뭐 이런 내용,,,
어떤 알고리즘 또는 기법을 사용해 문제를 해결했는지 알려주세요
#include <iostream>
using namespace std;
int** visited;
int** arr;
int M, N;
// visited랑 arr배열 재사용 위해 초기화해주는 함수
void init(int row, int col) {
visited = new int* [row];
arr = new int* [row];
for (int i = 0; i < row; i++) {
visited[i] = new int[col];
arr[i] = new int[col];
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
visited[i][j] = 0;
arr[i][j] = 0;
}
}
}
void dfs(int r, int c) {
if (arr[r][c] == 0) // 배추 없잖아!
return;
if (arr[r][c] == 1 && visited[r][c] == 1) // 배추 있는데 이미 방문한 곳
return;
if (arr[r][c] == 1 && visited[r][c] == 0) { // 배추 있는데 아직 방문을 안 했네!
visited[r][c] = 1; // 방문기록 남기고 갑니다요,,,~
// 여기서 나오는 조건문은 다 충돌검사 위한 거
// 그리고 상하좌우 재귀로 탐색하기
if (r - 1 >= 0)
dfs(r - 1, c);
if (r + 1 < N)
dfs(r + 1, c);
if (c - 1 >= 0)
dfs(r, c - 1);
if (c + 1 < M)
dfs(r, c + 1);
}
return;
}
int main() {
int T;
cin >> T;
while (T--) {
int K;
// ㅋㅋ 아니 보통 행-열 이렇게 주는데 얘넨 반대로 주더라
cin >> M >> N >> K;
// 난 열-행보단 행-열맨이라 ㅎㅅㅎ
init(N, M);
int cnt = 0;
for (int i = 0; i < K; i++) {
int x, y;
cin >> x >> y;
arr[y][x] = 1; // 배추 있는 곳 위치 표시
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
// 배추 있는데 방문 안 한 곳만
if (arr[i][j] == 1 && visited[i][j] == 0) {
cnt++; // 개수 더해주고
dfs(i, j); // 거기서부터 탐색할랭
}
else;
}
}
cout << cnt << "\n";
}
return 0;
}
솔루션에 접근하기 까지 아쉬웠던 부분 들을 적어주세요. 솔루션을 참조하고나서야 고친 점들을 적어주세요. 솔루션의 링크도 적어주세요. 막힘 없이 구현했다면, 생략해도 좋습니다.
해당 문제를 통해 배운 내용 들을 적어주세요. 어떤 알고리즘, 코딩 기법,자료구조 등을 알게됐다. 문법적 요소도 좋습니다. 크게 없으면 생략해도 좋습니다.
이 정도면 이제 어디 나가서 DFS 할 수 있다고 해도 되지 않을까 ㅎㅎ?
아래 문제도 완전 똑같은 문제예용. 이거 풀고 그 다음 걸로 이거 풀면 완전 개이득ㅋ 진짜 복붙해도 됨스 ㅎㅎ