Algorithm

[λ°±μ€€ 2468] μ•ˆμ „ μ˜μ—­

osean 2023. 5. 10. 20:41

문제

 

2468번: μ•ˆμ „ μ˜μ—­

μž¬λ‚œλ°©μž¬μ²­μ—μ„œλŠ” λ§Žμ€ λΉ„κ°€ λ‚΄λ¦¬λŠ” μž₯λ§ˆμ² μ— λŒ€λΉ„ν•΄μ„œ λ‹€μŒκ³Ό 같은 일을 κ³„νšν•˜κ³  μžˆλ‹€. λ¨Όμ € μ–΄λ–€ μ§€μ—­μ˜ 높이 정보λ₯Ό νŒŒμ•…ν•œλ‹€. κ·Έ λ‹€μŒμ— κ·Έ 지역에 λ§Žμ€ λΉ„κ°€ 내렸을 λ•Œ 물에 μž κΈ°μ§€ μ•ŠλŠ”

www.acmicpc.net

μž¬λ‚œλ°©μž¬μ²­μ—μ„œλŠ” λ§Žμ€ λΉ„κ°€ λ‚΄λ¦¬λŠ” μž₯λ§ˆμ² μ— λŒ€λΉ„ν•΄μ„œ λ‹€μŒκ³Ό 같은 일을 κ³„νšν•˜κ³  μžˆλ‹€. λ¨Όμ € μ–΄λ–€ μ§€μ—­μ˜ 높이 정보λ₯Ό νŒŒμ•…ν•œλ‹€. κ·Έ λ‹€μŒμ— κ·Έ 지역에 λ§Žμ€ λΉ„κ°€ 내렸을 λ•Œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ΄ μ΅œλŒ€λ‘œ λͺ‡ κ°œκ°€ λ§Œλ“€μ–΄ μ§€λŠ” 지λ₯Ό μ‘°μ‚¬ν•˜λ €κ³  ν•œλ‹€. μ΄λ•Œ, 문제λ₯Ό κ°„λ‹¨ν•˜κ²Œ ν•˜κΈ° μœ„ν•˜μ—¬, μž₯λ§ˆμ² μ— λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 따라 μΌμ •ν•œ 높이 μ΄ν•˜μ˜ λͺ¨λ“  지점은 물에 μž κΈ΄λ‹€κ³  κ°€μ •ν•œλ‹€.
μ–΄λ–€ μ§€μ—­μ˜ 높이 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μž₯λ§ˆμ² μ— 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ μ΅œλŒ€ 개수λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

첫째 μ€„μ—λŠ” μ–΄λ–€ 지역을 λ‚˜νƒ€λ‚΄λŠ” 2차원 λ°°μ—΄μ˜ ν–‰κ³Ό μ—΄μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 수 N이 μž…λ ₯λœλ‹€. N은 2 이상 100 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 각 μ€„μ—λŠ” 2차원 λ°°μ—΄μ˜ 첫 번째 ν–‰λΆ€ν„° N번째 ν–‰κΉŒμ§€ μˆœμ„œλŒ€λ‘œ ν•œ ν–‰μ”© 높이 정보가 μž…λ ₯λœλ‹€. 각 μ€„μ—λŠ” 각 ν–‰μ˜ 첫 번째 μ—΄λΆ€ν„° N번째 μ—΄κΉŒμ§€ N개의 높이 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžμ—°μˆ˜κ°€ 빈 칸을 사이에 두고 μž…λ ₯λœλ‹€. λ†’μ΄λŠ” 1이상 100 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

풀이

 

곡유 μ†ŒμŠ€ 보기

 

www.acmicpc.net

체크 포인트

λ¬Έμ œμ—μ„œ 주어진 μ˜μ—­μ˜ ν–‰λ ¬μ˜ 길이인 N 만 μ•Œλ €μ€˜ μ²˜μŒμ—λŠ” κ°•μˆ˜λŸ‰(λΉ„κ°€ 온 높이)λ₯Ό N 을 κΈ°μ€€μœΌλ‘œ μ‚ΌλŠ” κ²ƒμœΌλ‘œ μ΄ν•΄ν–ˆλ‹€.

ν•˜μ§€λ§Œ λ‹€μ‹œ μ‚΄νŽ΄λ³΄λ©΄ μ•ˆμ „ν•œ μ˜μ—­μ΄ μ΅œλŒ€μΈ 값을 좜λ ₯ν•˜λŠ” 것이기 λ•Œλ¬Έμ— 주어진 지역 별 높이λ₯Ό Set μžλ£Œν˜•μ— λ‹΄μ•„μ„œ 쀑볡을 μ œκ±°ν•˜μ—¬ 각 높이 별 μ•ˆμ „ μ˜μ—­μ˜ 개수λ₯Ό κ³„μ‚°ν•˜κ³  이λ₯Ό Vector 에 담도둝 ν–ˆλ‹€.

(이 λ•Œ, λ‚˜λŠ” DFS μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄ κ΅¬ν˜„ ν–ˆλŠ”λ° λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œλ„ ν’€ 수 μžˆλŠ”μ§€ 봐야겠닀.)

이 ν›„, Vector 에 λ‹΄κΈ΄ 주어진 높이 별 μ•ˆμ „ μ˜μ—­ 개수 쀑 μ΅œλŒ€κ°’λ§Œ 좜λ ₯ν•˜λ©΄ λœλ‹€.

#include <bits/stdc++.h>

using namespace std;

int n;
int adj[104][104], visited[104][104];
int dy[] = {-1, 0, 1, 0};
int dx[] = {0, 1, 0, -1};
set<int> range;

void dfs(int y, int x, int height) {
    visited[y][x] = 1;
    for (int i = 0; i < 4; i++) {
        int ny = y + dy[i];
        int nx = x + dx[i];
        if (ny < 0 || nx < 0 || ny >= n || nx >= n) continue;
        if (adj[ny][nx] < height) continue;
        if (!visited[ny][nx]) dfs(ny, nx, height);
    }
}

int main() {
    // μ§€μ—­μ˜ ν–‰λ ¬ 길이
    cin >> n;
    for (int y = 0; y < n; y++) {
        for (int x = 0; x < n; x++) {
            cin >> adj[y][x];
            range.insert(adj[y][x]);
        }
    }

    vector<int> result;
    for (int height : range) {
        int cnt = 0;
        for (int y = 0; y < n; y++) {
            for (int x = 0; x < n; x++) {
                if (adj[y][x] >= height && !visited[y][x]) {
                    cnt++;
                    dfs(y, x, height);
                }
            }
        }
        result.push_back(cnt);
        memset(visited, 0, sizeof(visited));
    }

    cout << *max_element(result.begin(), result.end());
}

'Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ°±μ€€ 2583] μ˜μ—­ κ΅¬ν•˜κΈ°  (0) 2023.05.11
[λ°±μ€€ 1012] μœ κΈ°λ† λ°°μΆ”  (0) 2023.05.08
[λ°±μ€€ 4375] 1  (0) 2023.04.23
[λ°±μ€€ 3986] 쒋은 단어  (0) 2023.04.18
[λ°±μ€€ 1940] μ£Όλͺ½  (0) 2023.04.17