dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 백준 DP
  • 프로그래머스 SQL
  • 그래프탐색
  • dp
  • 일기
  • 프로그래머스
  • 백준
  • 부스트캠프
  • 반성
  • c++
  • 서블릿
  • HackerRank mysql
  • 회고
  • 스프링
  • AI Tech
  • Baekjoon
  • Hackerrank
  • 네이버 부스트캠프
  • 기록
  • BFS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/백준 알고리즘

[baekjoon 2468] 안전영역 - 그래프탐색(BFS, DFS)

2020. 11. 24. 18:36
728x90

www.acmicpc.net/problem/2468

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

기본적으로 배열에 데이터를 받아서 그래프 탐색을 수행하는 문제였다.

다만 문제 마지막 조건에 아무 지역도 물에 잠기지 않을 수 있다는 조건으로 바로 맞추진 못했다..

 

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

int bound[101][101], N, height, resultMax, xmove[4] = { 1, -1, 0, 0 }, ymove[4] = { 0, 0, 1, -1 };
bool check[101][101];

void BFS2(int i, int j, int key) {
	queue<pair<int, int>> q;
	q.push(make_pair(i, j));
	check[i][j] = true;

	while (!q.empty()) {
		int x = q.front().first;
		int y = q.front().second;
		q.pop();

		for (int i = 0; i < 4; i++) {
			int tempX = x + xmove[i];
			int tempY = y + ymove[i];
			if (bound[tempX][tempY] > key && !check[tempX][tempY] && tempX < N && tempY < N && tempX >= 0 && tempY >= 0) {
				q.push(make_pair(tempX, tempY));
				check[tempX][tempY] = true;
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> bound [i][j];
			if (height < bound[i][j])
				height = bound[i][j]; // 높이정보범위용
		}
	}
	if (height >= 100)
		height = 100;

	for (int k = 0; k <= height; k++) {
		int count = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				check[i][j] = false;
			}
		}
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (bound[i][j] > k && !check[i][j]) {
					count += 1;
					BFS2(i, j, k);
				}
			}
		}
		if (resultMax < count)
			resultMax = count;
	}
	if (resultMax == 0)
		cout << 1;
	else
		cout << resultMax;
}

입력을 받은 후, 높이가 1부터 100이지만 1~100을 모두 비교하기엔 비효율적이라고 생각이 들어서 입력되는 element값 중에서 가장 큰 값을 최대높이로 지정했다.

+ 높이의 범위는 1~100이므로 100보다 높으면 그냥 100을 저장해주었다.

 

그렇게 저장된 높이만큼 반복문을 돌면서 매 높이때마다 영역을 구해주고, 그 영역 count중 최대인 것을 출력해주면 된다. (매 높이마다 bfs를 수행해야하기 때문에 check배열을 초기화해주었다.)

 

탐색 조건에서 key보다 높은 영역을 탐색하는 BFS2함수를 만들었고 영역 중 침수되지 않는 영역만 탐색을 하게 된다.

 

마지막으로 아무 지역도 물에 잠기지 않을 수 있다는 조건을 보아서

최종 resultMax값이 0이면 1을 출력하게 했다.

728x90

'문제 풀이 > 백준 알고리즘' 카테고리의 다른 글

[baekjoon 17269] 이름궁합 테스트- 문자열, 구현 (C++)  (0) 2020.12.27
[baekjoon 14425] 문자열 집합- 문자열, map (C++)  (0) 2020.12.24
[baekjoon 14502] 연구소 - 그래프탐색(BFS,DFS), 브루트포스  (0) 2020.12.05
[baekjoon 1922] 네트워크 연결 - 최소 스패닝 트리(크루스칼, Union-Find)  (0) 2020.11.29
[baekjoon 14438] 수열과 쿼리 17 - 세그먼트 트리  (0) 2020.11.20
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 14425] 문자열 집합- 문자열, map (C++)
    • [baekjoon 14502] 연구소 - 그래프탐색(BFS,DFS), 브루트포스
    • [baekjoon 1922] 네트워크 연결 - 최소 스패닝 트리(크루스칼, Union-Find)
    • [baekjoon 14438] 수열과 쿼리 17 - 세그먼트 트리
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바