문제

지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다. 각 격자 판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.

입력설명

첫 줄에 자연수 N이 주어진다.(1<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는 다.

출력설명

봉우리의 개수를 출력하세요.

입력예제

5
5 3 7 2 3
3 7 1 6 1
7 2 5 3 4
4 3 6 4 1
8 7 3 5 2

출력예제

10


#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
int main(){
	//freopen("input.txt", "rt", stdin);
	int n, i, j, k, flag=0, count=0;
	scanf("%d", &n);
	vector<vector <int>> mountain (n+2, vector<int>(n+2));
	
	for(i=1; i<=n; i++){
		for(j=1; j<=n; j++){
			scanf("%d", &mountain[i][j]);
		}
	}
	for(i=1; i<=n; i++){
		for(j=1; j<=n; j++){
			flag = 0;
			for(k=0; k<4; k++){
				if(mountain[i][j] <= mountain[i+dx[k]][j+dy[k]]){
					flag = 1;
					break;
				}
			}
			if(flag == 0){
				count++;
			}
		}
	}
	printf("%d", count);
	
	
	return 0;
}

문제도 코드도 그리 어렵지 않습니다. 다만 2차원 벡터를 선언하는게 생각보다 헷갈리네요.

vector<vector <int>> vector2D(n, vector<int>(m));

이런식으로 선언하시면 행과열이 각각 n과 m개의 2차원 벡터를 선언할수있습니다.
2차원이므로 이중for문을 사용해서 scanf를 받으면됩니다.
만약 배열이라면 int arr[n][m]; 식으로 선언하시면 됩니다.

다음으로 dx[], dy[]을 하는 이유

행을 i 열을 j라고 했을 때

  vector[i-1][j]  
vector[i][j-1] vector[i][j] vector[i][j+1]
  vector[i+1][j]  

상, 우, 하, 좌 방향으로보면 i = -1, 0, 1, 0이고 j = 0, 1, 0, -1이기 때문에 각각 dx와 dy를 더해주면 상하좌우를 탐색한다고  볼 수 있습니다.

+ Recent posts