Notice
Recent Posts
Recent Comments
Link
거의 알고리즘 일기장
유기농 배추_ 백준 1012번 본문
https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. (
www.acmicpc.net
1. 풀이 방법
일반적인 dfs풀이 + dfs가 몇번 호출되었나 세어주면 된다.
주의할 사항은 y, x순 입력이 아니라 x, y순 입력이라는것과 map과 visit배열을 testcase가 바뀔때마다 초기화시켜주어야 하는것 정도이다.
2. 코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int map[52][52];
bool visit[52][52];
int k, n, m;
void mapVisitErase()
{
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
map[i][j] = visit[i][j] = 0;
}
void dfs(int y, int x)
{
visit[y][x] = true;
if (y - 1 >= 0)
if (map[y - 1][x])
if (visit[y - 1][x] == false)
dfs(y - 1, x);
if (y + 1 < n)
if (map[y + 1][x])
if (visit[y + 1][x] == false)
dfs(y + 1, x);
if (x - 1 >= 0)
if (map[y][x - 1])
if (visit[y][x - 1] == false)
dfs(y, x - 1);
if (x + 1 < m)
if (map[y][x + 1] )
if (visit[y][x + 1] == false)
dfs(y, x + 1);
}
int main()
{
int testcase;
cin >> testcase;
for (int c = 0; c < testcase; c++)
{
cin >> m >> n >> k;
//map에 지렁이 넣기
int y, x;
for (int kc = 0; kc < k; kc++)
{
cin >> x >> y;
map[y][x] = 1;
}
//지렁이 수 세기
int cnt = 0;
for(int i =0; i<n; i++)
for (int j = 0; j < m; j++)
{
if (map[i][j] == 1 && visit[i][j] == false)
{
//dfs
dfs(i, j);
cnt++;
}
}
cout << cnt << '\n';
mapVisitErase();
}
return 0;
}
3. 후기
최근에 풀던 카카오 문제들이 손대는것마다 좌절감만 안겨줘서 좀 쉬운 문제를 풀어보자 해서 풀어보게 되었다.
물론 쉬운문제지만 혹시 좌표를 헷갈린다거나 초기화를 제때 안해주면 주어지는 테스트 케이스로는 판별할수 없어 삽질할수도 있다.
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
히스토그램에서 가장 큰 직사각형 _ 백준 6549번 (0) | 2020.04.02 |
---|---|
구간 합 구하기_ 백준 2042번 (0) | 2020.04.02 |
스티커 붙이기_백준 18808번 (0) | 2020.04.02 |
Sorting Game _ 알고스팟 _ 종만북 (0) | 2020.04.01 |
보행자 천국_카카오_프로그래머스 lv3 (0) | 2020.04.01 |
Comments