[BOJ / C++] 안전 영역 (BFS)

2025. 7. 8. 21:35·코딩테스트/BOJ

문제링크: https://www.acmicpc.net/problem/2468

 

 

1. 코드

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

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

int main() {
	ios::sync_with_stdio(0); cin.tie(0);

	int n;
	cin >> n;

	vector<vector<int>> board(n, vector<int>(n, 0));
	
	int maxH = 1;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> board[i][j];
			maxH = max(board[i][j], maxH);
		}
	}
	
	int maxSafe = 0;
	for (int height = 0; height <= maxH; height++) {  // height = 0부터 height <= maxH까지 확인 중요
		vector<vector<bool>> vis(n, vector<bool>(n, false));

		int num = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (board[i][j] <= height || vis[i][j]) continue;

				queue<pair<int, int>> Q;
				Q.push({i, j});
				vis[i][j] = true;
				num++;

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

					for (int dir = 0; dir < 4; dir++) {
						int nx = x + dx[dir];
						int ny = y + dy[dir];

						if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
						if (board[nx][ny] <= height || vis[nx][ny]) continue;

						Q.push({nx, ny});
						vis[nx][ny] = true;
					}
				}
			}
		}
		maxSafe = max(num, maxSafe);
	}

	cout << maxSafe;
}

 

2. 분석

 

문제에 보면 높이는 1이상 100 이하의 정수라고 되어있다. 그래서 처음에 height = 1 .. maxHeight까지 반복하며 bfs를 진행했다. 그러면 한 40% 정도에서 중간에 '틀렸습니다' 판정을 받는다. 계속 찾아보다가 문제 아래에서 이런 힌트를 발견했다.

즉, height = 0 부터 시작해야한다는 소리이다. 해당 edge case를 검출해내는 test case가 포함되어있는 모양이다.  이 부분에 주의해서 문제를 풀면 된다.

 

3. 시간복잡도

최대 n = 100이고, height 최대도 100이다. 시간복잡도는 O((maxH+1) * n^2)이고, 10^6 정도 이다. 시간제한 1초는 cpp가 10^7 ops/sec 안에 대충 들어오면 된다. 따라서 세제곱 모양이어도 n과 maxH가 충분히 작으므로 만족하게 된다..

 

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ / C++] 하노이 탑 이동 순서 (재귀)  (0) 2025.07.10
[BOJ / C++] 곱셈 (재귀)  (0) 2025.07.09
[BOJ / C++] 스타트링크 (BFS)  (0) 2025.07.08
[BOJ / C++] 단지번호붙이기 (BFS)  (0) 2025.07.07
[BOJ / C++] 영역 구하기 (BFS)  (0) 2025.07.06
'코딩테스트/BOJ' 카테고리의 다른 글
  • [BOJ / C++] 하노이 탑 이동 순서 (재귀)
  • [BOJ / C++] 곱셈 (재귀)
  • [BOJ / C++] 스타트링크 (BFS)
  • [BOJ / C++] 단지번호붙이기 (BFS)
sophon
sophon
sophon 님의 블로그 입니다.
  • sophon
    sophon 님의 블로그
    sophon
    • 카테고리 (172) N
      • 컴퓨터공학 (36)
        • 데이터베이스 (19)
        • 네트워크 (15)
        • 기타 이슈 (2)
      • 프로젝트 (16)
        • Java (8)
        • Spring (4)
        • Docker (4)
      • 코딩테스트 (95) N
        • BOJ (74)
        • 프로그래머스 (7)
        • 프로그래머스 SQL (12) N
        • PS Snippets (2)
      • 🌱 잡담 (22)
        • 자격증 (7)
        • 좋은 시 모음 (12)
        • 책과 영화 (3)
        • 기록 (0)
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sophon
[BOJ / C++] 안전 영역 (BFS)
상단으로

티스토리툴바