[백준 1012번 C/C++] 유기농 배추
[백준 1012번 C/C++] 유기농 배추

https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
해결전략
깊이 우선 탐색 DFS
너비 우선 탐색 BFS
둘 다 가능하다
DFS 풀이
#include <iostream> #include <map> #include <vector> using namespace std; int t; //t 테스트 케이스의 개수 int m, n, k; //m 가로길이, n 세로길이, k 위치의 개수 int cnt; vector<vector<int>> v; map<pair<int, int>, bool> myMap; int dirY[4] = { -1, 0, 1 ,0 }; int dirX[4] = { 0, -1, 0 ,1 }; void DFS(int y, int x) { for(int i=0; i<4; i++) { int newY = y + dirY[i]; int newX = x + dirX[i]; if (0<=newY && 0<=newX && newY<n && newX<m) { v[y][x] = 0; if (v[newY][newX] == 1) { //cout << "newY: " << newY << " newX: " << newX << "\n"; //새로운 배추 위치를 찾은 후 myMap의 bool 값을 false로 변경한다. //false로 변경하는 이유는? 밑에서 DFS를 중복으로 도는걸 방지한다. if (myMap.find({ newY, newX }) == myMap.end()) myMap[{newY, newX}] = false; cnt--;//최대 배추흰지렁이 마리수에서 -1 해준다 DFS(newY, newX);//새로 찾은 배추 위치에서 DFS 시작 } } } } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> t; int x, y; while(t--) { cin >> m >> n >> k; myMap.clear(); v.clear(); v.resize(n, vector<int>(m, 0)); cnt = k;//최대 배추흰지렁이 마리 수 //배추 위치 입력 for (int i=0; i<k; i++){ cin >> x >> y; v[y][x] = 1;//배추 위치는 1, 빈칸은 0 //배추 위치 map에 기록 myMap.insert(make_pair(make_pair(y, x), true)); } if(myMap.size() == 0 || myMap.size() == 1){ cout << cnt << "\n"; } else { //myMap 사이즈 만큼 for문을 돌며 조건에 맞으면 DFS를 돈다. for (pair<const pair<int, int>, bool>& iter : myMap) { //myMap의 bool값이 true인 경우 DFS를 시작한다. if (iter.second == true) { //cout << "y : " << iter.first.first << " x : " << iter.first.second << "\n"; DFS(iter.first.first, iter.first.second); } } cout << cnt << "\n"; } } return 0; }
v.clear();
myMap.clear();
행렬과 맵의 초기화를 해줘야 한다. 주의하자.
BFS 풀이
#include <iostream> #include <queue> #include <vector> using namespace std; int t; //t 테스트 케이스의 개수 int m, n, k; //m 가로길이, n 세로길이, k 위치의 개수 int cnt; vector<vector<int>> v; queue<int> Q; int dirY[4] = { -1, 0, 1 ,0 }; int dirX[4] = { 0, -1, 0 ,1 }; void BFS(int y, int x) { queue<pair<int, int>> Q; Q.push({ y, x }); while (!Q.empty()) { int curY = Q.front().first; int curX = Q.front().second; Q.pop(); for (int i = 0; i < 4; i++) { int newY = curY + dirY[i]; int newX = curX + dirX[i]; if (0 <= newY && newY < n && 0 <= newX && newX < m) { // 아직 방문하지 않은 배추 위치 if (v[newY][newX] == 1) { v[newY][newX] = 0; Q.push({ newY, newX }); } }//if }//for }//while } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> t; int x, y; while(t--) { cin >> m >> n >> k; v.resize(n, vector<int>(m, 0)); cnt = 0;//필요한 배추흰지렁이 마리 수 초기화 //배추 위치 입력 for (int i=0; i<k; i++){ cin >> x >> y; v[y][x] = 1;//배추 위치는 1, 빈칸은 0 } for(int y = 0; y < n; y++){ for (int x = 0; x < m; x++) { //배추 위치를 발견하면 BFS 실행 if (v[y][x] == 1) { cnt++; BFS(y, x); } } } cout << cnt << "\n"; v.clear();//행렬 초기화 } return 0; }
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2 (0) | 2023.08.29 |
---|---|
[백준 2580번 C/C++] 스도쿠 (0) | 2023.08.20 |
[백준 11660번 C/C++] 구간 합 구하기 5 (0) | 2023.08.16 |
[백준 17179번 C/C++] 케이크 자르기 (0) | 2023.08.11 |
[백준 26069번 C/C++] 붙임성 좋은 총총이 (0) | 2023.08.10 |
댓글
이 글 공유하기
다른 글
-
[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2
[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2
2023.08.29[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2 https://www.acmicpc.net/problem/12015 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 해결 전략 최대 증가길이 수열, 이분 탐색 Longest Increasing Subsequence, LIS 처음 시도한 코드 - 시간 초과 #include #include using namespace std; int n, result; vector v, LIS; int main() { ios::sync_with_stdio(false)… -
[백준 2580번 C/C++] 스도쿠
[백준 2580번 C/C++] 스도쿠
2023.08.20[백준 2580번 C/C++] 스도쿠 https://www.acmicpc.net/problem/2580 2580번: 스도쿠 스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루 www.acmicpc.net 해결전략 재귀 백트랙킹 Backtracking DFS 코드 #include #include using namespace std; vector v(9, vector(9)); // 현재 위치 (y, x)에 newNum을 놓았을 때 유효한지 행, 열, 3x3 작은 사각형을 검사하는 함수 bool isSafe(int y, int x, int newNum) { // 행… -
[백준 11660번 C/C++] 구간 합 구하기 5
[백준 11660번 C/C++] 구간 합 구하기 5
2023.08.16[백준 11660번 C/C++] 구간 합 구하기 5 https://www.acmicpc.net/problem/11660 11660번: 구간 합 구하기 5 첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 www.acmicpc.net 해결전략 Dynamic Programming (DP) 다이나믹 프로그래밍 누적 합 코드 #include #include using namespace std; int n, m; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >>… -
[백준 17179번 C/C++] 케이크 자르기
[백준 17179번 C/C++] 케이크 자르기
2023.08.11[백준 17179번 C/C++] 케이크 자르기 https://www.acmicpc.net/problem/17179 17179번: 케이크 자르기 첫 번째 줄에 자르는 횟수가 담긴 목록의 길이 N과 자를 수 있는 지점의 개수 M, 그리고 롤 케이크의 길이인 정수 L이 주어진다. (1 ≤ N ≤ M ≤ 1,000, 1 < L ≤ 4,000,000) 다음 M줄에 걸쳐 자를 수 있는 www.acmicpc.net 해결전략 이분탐색, 매개변수 탐색 코드 #include #include #include using namespace std; // n: 자르는 횟수, m: 자를 수 있는 위치 개수, l: 롤 케이크의 길이를 저장 int n, m, l; // v: 자르는 위치를 저장할 벡터 vector v; // 목표한 크…
댓글을 사용할 수 없습니다.