Notice
Recent Posts
Recent Comments
Link
거의 알고리즘 일기장
유기농 배추_ 백준 1012번 본문
https://www.acmicpc.net/problem/1012
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