알고리즘 :: 큰돌 :: Chapter2 - DFS/BFS :: 백준 1629 곱셈

Embedded June·2023년 6월 30일
0
post-thumbnail

문제

문제링크

해설

  • 시키는대로 하면 되는 문제입니다만, 한 가지 반례를 생각해야 하는 점이 조금 까다로운 문제입니다.
    • 바로, '비가 내리지 않을 수도 있다'는 점이 문제에 숨겨져 있다는 점입니다.
    • 따라서 모든 경우의 수를 검사할 때 비를 의미하는 반복문의 시작은 1이 아니라 0부터 시작해야 합니다.
  • 최대 100 × 100 배열이고 검사할 높이도 100이므로 최악의 경우 100만 번 검사하므로 충분히 bruteforce + DFS/BFS로 시간 내에 풀 수 있습니다.
  • 프로그램 연산 효율을 위해
    • 실제로 지도에서 비가 내린 것을 반영 (각 칸마다 뺄셈연산)하는 것 보다는 비교연산 하는 게 낫습니다.
    • memset() 함수를 이용해서 visited 배열을 초기화합니다.

코드

#include <iostream>
#include <cstring>
using namespace std;

constexpr int d[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

int N, city[102][102];
bool visited[102][102];

void dfs(int y, int x, const int& h) {
    visited[y][x] = true;
    for (auto i : d) {
        int ny = y + i[0], nx = x + i[1];
        if (city[ny][nx] > h && !visited[ny][nx]) dfs(ny, nx, h);
    }
}

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    cin >> N;

    int max_height = 0;
    for (int y = 1; y <= N; y++) {
        for (int x = 1; x <= N; x++) {
            cin >> city[y][x];
            max_height = max(max_height, city[y][x]);
        }
    }
    int answer = 0;
    for (int h = 0; h <= max_height; h++) {
        int result = 0;
        for (int y = 1; y <= N; y++)
            for (int x = 1; x <= N; x++)
                if (city[y][x] > h && !visited[y][x])
                    dfs(y, x, h), result++;
        answer = max(answer, result);
        memset(visited, false, sizeof(visited));
    }
    cout << answer << '\n';
    return 0;
}

소스코드 링크

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글