일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 딥러닝
- DP
- 프로그래밍언어론
- dfs
- leetcode
- 라인
- 모두를 위한 딥러닝
- 알고리즘
- 스타벅스
- C++
- STL
- 머신러닝
- C/C++
- 다이나믹프로그래밍
- 시애틀
- 스프링 프레임워크
- binary search
- 라인플러스
- Python
- BFS
- 백준
- Spring Framework
- jvm
- 파이썬
- 백트래킹
- 릿코드
- Java
- spring
- 벤쿠버
- 프로그래머스
- Today
- Total
케이스윔의 개발 블로그
[백준 알고리즘][DFS] 1012번 유기농 배추 본문
문제
세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다.
(한 배추의 상하좌우 네 방향에 다른 배추가 위치한 경우에 서로 인접해있다고 간주한다)
한나가 배추를 재배하는 땅은 고르지 못해서 배추를 군데군데 심어놓았다. 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배추들이 몇 군데에 퍼져있는지 조사하면 총 몇 마리의 지렁이가 필요한지 알 수 있다. 예를 들어 배추밭이 아래와 같이 구성되어 있으면 최소 5마리의 배추흰지렁이가 필요하다. (0은 배추가 심어져 있지 않은 땅이고, 1은 배추가 심어져 있는 땅을 나타낸다.)
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
입력과 출력
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 첫째 줄에는 배추를 심은 배추밭의 가로길이 M(1 ≤ M ≤ 50)과 세로길이 N(1 ≤ N ≤ 50), 그리고 배추가 심어져 있는 위치의 개수 K(1 ≤ K ≤ 2500)이 주어진다. 그 다음 K줄에는 배추의 위치 X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)가 주어진다. 출력은 각 테스트 케이스에 대해 필요한 최소의 배추흰지렁이 마리 수이다.
풀이
배추가 모여있는 곳을 하나의 컴포넌트라 생각했을 때 하나의 컴포넌트는 그래프로 표현할 수 있다. (근데 어떻게 그래프로 표현할지모르겠음) DFS를 통해 몇개의 컴포넌트가 있는지를 알아내면 최소한 필요한 지렁이의 수를 알 수 있다. DFS에 대한 이론을 공부하면서 c++의 vector를 이용한 코드를 봤는데 한눈에 이해가 가긴하는데 이걸 그대로 써서 문제를 풀어야할지 아니면 원래 c로 하던대로 스택을 만들어서 풀지 고민이 된다. 알고리즘 공부하면서 c++도 같이 공부할려고 했는데 생각대로 잘 안되고 DP문제는 거의 배열만 있으면 다 해결이 돼서 C++의 STL을 거의 사용할필요가없었는데..
일단 하나의 컴포넌트마다 그래프로 표현하기 위한 방법을 생각해보면.. 여기서부터 바로 막혔다 일단 처음 들어온 M*N 만큼 배열을 만든다음에 예제 그림과 같이 1과 0으로 이루어지는 행렬로 만든다 그다음에 인접한 아이들을 반복문을 돌면서 찾는다. 그래프로 만들어서 DFS하고 싶었는데 실패.. 그냥 재귀함수로 구현해버렸다. 예제로 벡터사용법 이용해서 visual2010이상으로 컴파일할 때 다시 해봐야겠다.재귀로도 너무 쉽게 풀리는 문제여서..
(+추가 2018.12.31)
2018년 1월 13일의 나는 왜이렇게 바보였지? 꼭 그래프를 만들어서 DFS를 풀어야겠다고 생각을 했나보다. DFS 개념자체가 깊이를 우선적으로 탐색한다는 것이기 때문에 재귀로 푸는 자체도 DFS인데! 맞게 풀었던 문제인데 벡터를 써본적도 없을 때고 백준 온라인저지에서도 익숙하지 않아서 맞게 푼 코드도 런타임 에러를 받았었다. 거의 약 1년 전에 푼 코드와 글을 읽어보니까 웃기고 신기하다. 그 사이에 꽤 많은 문제를 풀긴했나보다. 오늘은 간단하게 vector에 배추들의 위치를 다 넣은다음 DFS() 수행횟수를 구해주었다.
코드
void check(int i, int j)
{
if(i<0 || j<0 || i>=m || j>=n)
return ;
cabbage[i][j] = 0;
//오른쪽 보기
if(j+1<=n && cabbage[i][j+1] == 1)
{
check(i, j+1);
}
//왼쪽보기
if(j-1>=0 && cabbage[i][j-1] == 1)
{
check(i, j-1);
}
//위쪽보기
if(i-1>=0 && cabbage[i-1][j] == 1)
{
check(i-1, j);
}
//아래쪽보기
if(i+1<=m && cabbage[i+1][j] == 1)
{
check(i+1, j);
}
}
new 버전: https://github.com/kswim/Algorithm/blob/master/DFS/1012.cpp
'Algorithm > DFS &BFS' 카테고리의 다른 글
[백준 알고리즘][DFS] 10265번 MT (0) | 2018.01.20 |
---|---|
[백준 알고리즘][DFS] 2468번 안전영역 (0) | 2018.01.19 |
[백준 알고리즘][DFS] 11403번 경로 찾기 (0) | 2018.01.19 |
[백준 알고리즘][DFS] 11724번 연결 요소의 개수 (0) | 2018.01.18 |
[백준 알고리즘][DFS] 9466번 텀 프로젝트 (0) | 2018.01.14 |