
BOJ 1016 제곱 ㄴㄴ 수
2023-05-25
1 min
농부 민식이가 관리하는 농장은 N×M 격자로 이루어져 있다. 민식이는 농장을 관리하기 위해 산봉우리마다 경비원를 배치하려 한다. 이를 위해 농장에 산봉우리가 총 몇 개 있는지를 세는 것이 문제다.
산봉우리의 정의는 다음과 같다. 산봉우리는 같은 높이를 가지는 하나의 격자 혹은 인접한 격자들의 집합으로 이루어져 있다. (여기서 "인접하다"의 정의는 X좌표 차이와 Y좌표 차이 모두 1 이하일 경우로 정의된다.) 또한 산봉우리와 인접한 격자는 모두 산봉우리의 높이보다 작아야한다.
문제는 격자 내에 산봉우리의 개수가 총 몇 개인지 구하는 것이다.
첫째 줄에 정수 N(1 < N ≤ 100), M(1 < M ≤ 70)이 주어진다.
둘째 줄부터 N+1번째 줄까지 각 줄마다 격자의 높이를 의미하는 M개의 정수가 입력된다.
격자의 높이는 500보다 작거나 같은 음이 아닌 정수이다.
산봉우리의 개수를 구하는 문제이다.
DFS를 이용해 산봉우리를 찾아내면 된다.
이 때 주의할 점은 문제에서 제시된 산봉우리는 같은 높이를 가지는 하나의 격자 혹은 인접한 격자들의 집합으로 이루어져 있다. (여기서 "인접하다"의 정의는 X좌표 차이와 Y좌표 차이 모두 1 이하일 경우로 정의된다.)
조건으로 인해 상하좌우 뿐 아니라 대각선의 높이 또한 고려해야 한다는 점이다.
import java.io.*; public class Main { static int N, M, top = 0; static boolean flag = false; static int[][] mountain; static boolean[][] visit; static int[][] dir = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}, {-1, 1}, {-1, -1}, {1, -1}, {1, 1}}; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] info = br.readLine().split(" "); N = Integer.parseInt(info[0]); M = Integer.parseInt(info[1]); mountain = new int[N][M]; visit = new boolean[N][M]; for (int i = 0; i < N; i++) { info = br.readLine().split(" "); for (int j = 0; j < M; j++) { mountain[i][j] = Integer.parseInt(info[j]); } } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if(!visit[i][j]) { flag = false; DFS(i, j); if (!flag) top++; } } } System.out.println(top); } private static void DFS(int x, int y) { visit[x][y] = true; for (int k = 0; k < 8; k++) { int nextX = x + dir[k][0]; int nextY = y + dir[k][1]; if (nextX >= 0 && nextY >= 0 && nextX < N && nextY < M) { if (mountain[nextX][nextY] > mountain[x][y]) flag = true; if (!visit[nextX][nextY] && mountain[nextX][nextY] == mountain[x][y]) DFS(nextX, nextY); } } } }
#include <iostream> #define endl '\n' using namespace std; int N, M, top = 0; bool flag = false; int** mountain; bool** visit; int dir[8][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}, {-1, 1}, {-1, -1}, {1, -1}, {1, 1}}; void DFS(int x, int y) { visit[x][y] = true; for (int k = 0; k < 8; k++) { int nextX = x + dir[k][0]; int nextY = y + dir[k][1]; if (nextX >= 0 && nextY >= 0 && nextX < N && nextY < M) { if (mountain[nextX][nextY] > mountain[x][y]) flag = true; if (!visit[nextX][nextY] && mountain[nextX][nextY] == mountain[x][y]) DFS(nextX, nextY); } } } int main(void) { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> N >> M; mountain = new int*[N]; visit = new bool*[N]; for(int i = 0; i < N; i++) { mountain[i] = new int[M]; visit[i] = new bool[M]; } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> mountain[i][j]; } } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if(!visit[i][j]) { flag = false; DFS(i, j); if (!flag) top++; } } } cout << top << endl; return 0; }
var top = 0 var N: Int = 0 var M: Int = 0 var flag = false var dir = arrayOf(intArrayOf(0, -1), intArrayOf(0, 1), intArrayOf(1, 0), intArrayOf(-1, 0), intArrayOf(-1, 1), intArrayOf(-1, -1), intArrayOf(1, -1), intArrayOf(1, 1)) lateinit var mountain:Array<Array<Int>> lateinit var visit:Array<Array<Boolean>> fun DFS(x: Int, y: Int) { visit[x][y] = true for(k in dir) { var nextX: Int = x + k[0] var nextY: Int = y + k[1] if (nextX >= 0 && nextY >= 0 && nextX < N && nextY < M) { if(mountain[nextX][nextY] > mountain[x][y]) flag = true if(!visit[nextX][nextY] && mountain[nextX][nextY] == mountain[x][y]) DFS(nextX, nextY) } } } fun main() { val input = readLine()!!.split(' ') N = input[0].toInt() M = input[1].toInt() mountain = Array<Array<Int>>(N){Array<Int>(M){ 0 } } visit = Array<Array<Boolean>>(N){Array<Boolean>(M){ false } } for(i in 0 until N) { val info = readLine()!!.split(' ') for(j in 0 until M) mountain[i][j] = info[j].toInt() } for(i in 0 until N) { for(j in 0 until M) { if(!visit[i][j]) { flag = false DFS(i, j) if(!flag) top += 1 } } } print(top) }
top = 0 flag = False dir = [[0, -1], [0, 1], [1, 0], [-1, 0], [-1, 1], [-1, -1], [1, -1], [1, 1]] def DFS(x, y): global flag visit[x][y] = True for k in dir: nextX = x + k[0] nextY = y + k[1] if nextX >= 0 and nextY >= 0 and nextX < N and nextY < M: if mountain[nextX][nextY] > mountain[x][y]: flag = True if not visit[nextX][nextY] and mountain[nextX][nextY] == mountain[x][y]: DFS(nextX, nextY) def main(): global N, M, top, flag global mountain, visit N, M = map(int, input().split()) mountain = [[0 for col in range(M)] for row in range(N)] visit = [[0 for col in range(M)] for row in range(N)] for i in range(N): info = input().split() for j in range(M): mountain[i][j] = int(info[j]) for i in range(N): for j in range(M): if not visit[i][j]: flag = False DFS(i, j) if not flag: top += 1 print(top) if __name__ == "__main__": main()
import Foundation var top = 0, M: Int!, N: Int! var flag = false let dir = [[0, -1], [0, 1], [1, 0], [-1, 0], [-1, 1], [-1, -1], [1, -1], [1, 1]] var visit: [[Bool]]! var mountain: [[Int]]! func DFS(x: Int, y: Int) { visit[x][y] = true; for k in dir { let nextX = x + k[0] let nextY = y + k[1] if nextX >= 0 && nextY >= 0 && nextX < N && nextY < M { if mountain[nextX][nextY] > mountain[x][y] { flag = true } if !visit[nextX][nextY] && mountain[nextX][nextY] == mountain[x][y] { DFS(x: nextX, y: nextY) } } } } func main() { let inp = readLine()!.components(separatedBy: " ") N = Int(inp[0])! M = Int(inp[1])! mountain = Array(repeating: Array(repeating: 0, count: M), count: N) visit = Array(repeating: Array(repeating: false, count: M), count: N) for i in 0..<N { let info = readLine()!.components(separatedBy: " ") for j in 0..<M { mountain[i][j] = Int(info[j])! } } for i in 0..<N { for j in 0..<M { if !visit[i][j] { flag = false DFS(x: i, y: j) if !flag { top += 1 } } } } print(top) } main()