-
[ DFS | BFS ] 음료수 얼려 먹기알고리즘/이코테 - 실전 2021. 7. 28. 15:55
난이도 : 중하 풀이시간 : 30분 시간제한 : 1초
[ DFS | BFS ] 음료수 얼려 먹기
N * M 크기의 얼음틀이 있다. 구멍이 뚫려있는 부분은 0, 칸막이가 존재하는 부분은 1로 표시된다. 구멍이 뚫려 있는 부분끼리 상, 하, 좌, 우로 붙어 있는 경우 서로 연결되어 있는 것으로 간주한다. 이때 얼음 틀의 모양이 주어졌을 때 생성되는 총 아이스크림의 개수를 구하는 프로그램을 작성하시오. 다음의 4 X 5 얼음 틀 예시에서는 아이스크림이 총 3개 생성된다.
:: 입력 조건
- 첫 번째 줄에 얼음 틀의 세로 길이 N과 가로 길이 M이 주어진다.(1 <= N, M <= 1000)
- 두 번째 줄부터 N + 1 번째 줄까지 얼음 틀의 형태가 주어진다.
- 이때 구멍이 뚫려있는 부분은 0, 그렇지 않은 부분은 1이다.
:: 출력 조건
- 한 번에 만들 수 있는 아이스크림의 개수를 출력한다.
내 코드
#include <string> #include <vector> #include <iostream> #include <algorithm> #include <cstdio> using namespace std; #define endl "\n" int n = 0, m = 0; int trey[1000][1000] = { 0, }; bool dfs(int x, int y) { if (x < 0 || x >= n || y < 0 || y >= m) { return false; } if (trey[x][y] == 0) { trey[x][y] = 1; dfs(x - 1, y); dfs(x, y - 1); dfs(x + 1, y); dfs(x, y + 1); return true; } return false; } int main() { cin >> n >> m; int res = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf_s("%1d", &trey[i][j]); } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (dfs(i, j)) { res++; } } } cout << res << endl; }
정답 코드
#include <bits/stdc++.h> using namespace std; int n, m; int graph[1000][1000]; // DFS로 특정 노드를 방문하고 연결된 모든 노드들도 방문 bool dfs(int x, int y) { // 주어진 범위를 벗어나는 경우에는 즉시 종료 if (x <= -1 || x >=n || y <= -1 || y >= m) { return false; } // 현재 노드를 아직 방문하지 않았다면 if (graph[x][y] == 0) { // 해당 노드 방문 처리 graph[x][y] = 1; // 상, 하, 좌, 우의 위치들도 모두 재귀적으로 호출 dfs(x - 1, y); dfs(x, y - 1); dfs(x + 1, y); dfs(x, y + 1); return true; } return false; } int main() { // N, M을 공백을 기준으로 구분하여 입력 받기 cin >> n >> m; // 2차원 리스트의 맵 정보 입력 받기 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%1d", &graph[i][j]); } } // 모든 노드(위치)에 대하여 음료수 채우기 int result = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { // 현재 위치에서 DFS 수행 if (dfs(i, j)) { result += 1; } } } cout << result << '\n'; // 정답 출력 }
리뷰
dfs 함수를 다시 호출하고 main 함수에서 처리하는 부분
잘 기억이 안나서 정답코드를 참고했음
두 부분을 틀려서 고치는데에 시간을 많이 소요했음
1. cin 으로 입력을 받을 경우 공백이 없으면 문자가 모두 하나로 인식됨
000 > 0
그 부분을 %1d 로 한 자리씩 받아주니까 입력이 잘 들어갔음
2. dfs 함수 내에서 범위를 체크할 때
x > n || y > m 으로 설정함
x가 n인 경우에도 false 를 반환해야하는데 그렇지 않아서 결과값이 다르게 나왔음
x >= n || y >= m 으로 수정 후 결과값이 잘 나옴
'알고리즘 > 이코테 - 실전' 카테고리의 다른 글
[ 정렬 ] 성적이 낮은 순서로 학생 출력하기 (0) 2021.08.10 [ 정렬 ] 위에서 아래로 (0) 2021.08.10 [ DFS | BFS ] 미로 탈출 (0) 2021.07.28 [구현] 게임 개발 (0) 2021.07.19 [구현] 왕실의 나이트 (0) 2021.07.15