PS/BaekJoon

[BaekJoon 1743번] 음식물 피하기(C++)

박땅콩 2022. 8. 10.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

1743번: 음식물 피하기

첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다.  그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다

www.acmicpc.net

 

 

[문제 설명]

 

 

코레스코 콘도미니엄 8층은 학생들이 3끼의 식사를 해결하는 공간이다. 그러나 몇몇 비양심적인 학생들의 만행으로 음식물이 통로 중간 중간에 떨어져 있다. 이러한 음식물들은 근처에 있는 것끼리 뭉치게 돼서 큰 음식물 쓰레기가 된다. 

이 문제를 출제한 선생님은 개인적으로 이러한 음식물을 실내화에 묻히는 것을 정말 진정으로 싫어한다. 참고로 우리가 구해야 할 답은 이 문제를 낸 조교를 맞추는 것이 아니다. 

통로에 떨어진 음식물을 피해가기란 쉬운 일이 아니다. 따라서 선생님은 떨어진 음식물 중에 제일 큰 음식물만은 피해 가려고 한다. 

선생님을 도와 제일 큰 음식물의 크기를 구해서 “10ra"를 외치지 않게 도와주자.

 

 

[입력]

 

 

첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다.  그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다.

좌표 (r, c)의 r은 위에서부터, c는 왼쪽에서부터가 기준이다. 입력으로 주어지는 좌표는 중복되지 않는다.

 

 

[출력]

 

 

첫째 줄에 음식물 중 가장 큰 음식물의 크기를 출력하라.

 

 

[입출력 예]

 

 

입력 출력
3 4 5
3 2
2 2
3 1
2 3
1 1
4

 

 

[힌트]

 

# . . .
. # # .
# # . .

위와 같이 음식물이 떨어져있고 제일큰 음식물의 크기는 4가 된다. (인접한 것은 붙어서 크게 된다고 나와 있음. 대각선으로는 음식물 끼리 붙을수 없고 상하좌우로만 붙을수 있다.)

 

 

[문제 풀이]

 

 

음식물이 떨어진 좌표를 받을 때 탐색을 할 통로[음식물 떨어진 x좌표 - 1][음식물 떨어진 y좌표 - 1] = 1로 저장했다.

( -1을 한 이유는 배열은 0부터 시작되기 때문이다)

 

그리고 시작점을 찾기 위해 2중 for문을 이용해 시작점을 찾고 BFS 알고리즘을 사용했다.

그리고 음식물의 크기는 큐에서 pop하는 횟수라고 알 수 있다.

그래서 max 함수를 이용하여 시작점을 찾고 음식물의 크기를 구할 때마다 가장 큰 값을 찾을 수 있도록 했다.

 

그리고 이문제는 백준 1926번 그림 문제와 유사하다.

 

[BaekJoon 1926번] 그림(C++)

※주의※ 저의 풀이가 정답은 아닙니다. 다른 코드가 더 효율적이거나 좋을 수 있습니다. 언제나 다른 사람의 코드는 참고만 하시기 바랍니다. [문제 풀이 사이트] 1926번: 그림 어떤 큰 도화지에

park-peanut.tistory.com

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/BAEKJOON: Study BaekJoon for Coding Test

Study BaekJoon for Coding Test. Contribute to SmallPeanutPark/BAEKJOON development by creating an account on GitHub.

github.com

 

 

#include <bits/stdc++.h>
using namespace std;

int board[101][101];
bool visited[101][101];

int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int answer = 0;
    int N, M, K; // 세로, 가로, 음식물쓰레기 개수
    cin >> N >> M >> K;
    for(int i = 0; i < N; ++i) {
        fill(board[i], board[i] + M, 0);
        fill(visited[i], visited[i] + M, false);
    }

    for(int i = 0; i < K; ++i) {
        int r, c;
        cin >> r >> c;
        board[r-1][c-1] = 1; // 음식물인 경우 1로 표시
    }
    
    queue<pair<int, int>> q;
    for(int i = 0; i < N; ++i) {
        for(int j = 0; j < M; ++j) {
            if(visited[i][j] || board[i][j] == 0) continue;
            // 음식물일 때만 확인
            q.push({i,j});
            visited[i][j] = true;
            int cnt = 0;
            while(!q.empty()) {
                pair<int, int> cur = q.front();
                q.pop();
                cnt += 1;
                for(int k = 0; k < 4; ++k) {
                    int nx = cur.first + dx[k];
                    int ny = cur.second + dy[k];
                    if(nx < 0 || nx >= N || ny < 0 || ny >= M) continue;
                    if(visited[nx][ny] || board[nx][ny] == 0) continue;
                    q.push({nx,ny});
                    visited[nx][ny] = true;
                }
            }
            answer = max(answer, cnt);
        }
    }
    cout << answer;
}
728x90

'PS > BaekJoon' 카테고리의 다른 글

[BaekJoon 4963번] 섬의 개수(C++)  (0) 2022.08.10
[BaekJoon 1303번] 전쟁 - 전투(C++)  (0) 2022.08.10
[BaekJoon 3055번] 탈출(C++)  (0) 2022.08.09
[BaekJoon 5427번] 불(C++)  (0) 2022.08.09
[BaekJoon 6603번] 로또(C++)  (0) 2022.08.08

댓글