Home [BOJ] 1743 음식물 피하기
Post
Cancel

[BOJ] 1743 음식물 피하기

https://www.acmicpc.net/problem/7576


음식물이 땅에 놓여져 있으니까 그걸 피해가야합니다.

가장 큰 음식물은 뭘까요??? 찾아봅시다.


문제 핵심 IDEA

쉬운 문제입니다.

핵심 아이디어는 DFS입니다.

가장 큰 음식물 덩어리를 찾기만 하면 되는 거죠.

연결된 곳을 통해서 잘 탐색을 해주면 됩니다.


생각흐름

평소 문제처럼 탐색 기반이 되는 map을 제공하지 않습니다.

하지만 확인할 수 있는 예시와 좌표그림이 있기 때문에 똑같이 map이 있다고 생각하고 진행하면 됩니다.

첫번째 접근

DFS의 가장 기본적인 코딩으로 문제를 풀었습니다.

맨 처음에 좌표를 입력 받을 때 각 좌표를 벡터에 저장해두고 그 부분들을 모두 탐색하는 방식을 선택했습니다.

그리고 각 좌표를 DFS로 탐색한 이후에 최대 카운트를 비교해서 최댓값 갱신만 해주면 됩니다.


정답코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <utility>
#include <vector>
using namespace std;

int N, M;
int dirx[4] = {1,0,-1,0};
int diry[4] = {0,1,0,-1};
int map[101][101];
bool visit[101][101];
typedef pair<int, int> P; // (r,c) = (j, i)
vector<P> pos;
int cnt = 0;
int maxi = 0;

void dfs(int r, int c) {
    cnt++;
    visit[r][c] = true;
    
    for (int i = 0; i < 4; i++) {
        int nr = r + dirx[i];
        int nc = c + diry[i];
        
        if (nr >= 0 && nr <= N && nc >= 0 && nc <= M) {
            if (!visit[nr][nc] && map[nr][nc] == 1) {
                dfs(nr, nc);
            }
        }
    }
}

int main() {
    int K;
    
    cin >> N >> M >> K;
    
    for (int i = 0; i < K; i++) {
        int r, c;
        
        cin >> r >> c;
        
        map[r][c] = 1;
        
        pos.push_back(P(r,c));
    }
    
    for (int i = 0; i < pos.size(); i++) {
        cnt = 0;
        dfs(pos[i].first,pos[i].second);
          
        if (cnt > maxi)
            maxi = cnt;
    }

    
    cout << maxi << "\n";
}

깃허브 - https://github.com/cow-coding/algorithm/blob/master/BOJ/1743.cpp

This post is licensed under CC BY 4.0 by the author.

[BOJ] 15780 멀티탭 충분하니?

[Programmers] 카카오 블라인드 2021 - 신규 아이디 추천

Comments powered by Disqus.