#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
int n, count = 0;;
bool flag = true;
scanf("%d", &n);
vector<int> num(n + 2, 0);
vector<vector<int>> map(n + 2, num);
for (int i = 1; i < map.size() - 1; i++)
{
for (int j = 1; j < num.size() - 1; j++)
{
scanf(" %d", &num[j]);
}
map[i] = num;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
flag = true;
if (map[i][j] <= map[i - 1][j] || map[i][j] <= map[i + 1][j] || map[i][j] <= map[i][j - 1] || map[i][j] <= map[i][j + 1])
flag = false;
if (flag)
count++;
}
}
printf("%d", count);
return 0;
}
1. 2차원 벡터의 행, 열의 개수를 n(n*n 배열), 봉우리의 개수를 count 로 선언하고 봉우리인지 구분하기 위한 boolean 변수 flag 를 선언한다.
!! 알게 된 점 !!
- 2차원 벡터 초기화 방법
vector<int> num(n + 2, 0);
vector<vector<int>> map(n + 2, num);
(n+2 * n+2) 크기의 배열의 원소를 전부 0으로 초기화하는 방법이다. 1차원 벡터를 0으로 초기화 한 후 그 벡터로 2차원 벡터를 초기화하는 원리이다.
- 여러개 정수를 입력받아서 vector에 할당하기
for (int j = 1; j < num.size() - 1; j++)
{
scanf(" %d", &num[j]);
}
" %d" 가 핵심이다. %d 앞에 공백을 넣어 개행문자를 무시하고 정수를 입력받겠다는 의미이다.
ex) 27 33 80 73 19 23 15
2. 2차원 벡터의 (1,1) 값부터 차례대로 상, 하, 좌, 우의 값을 확인하여 최종적으로 그 값이 제일 크다면 flag = true가 되어 count++ (봉우리이기 때문)
상 = 윗 행이므로 [ i + 1 ]
하 = 아래 행이므로 [ i - 1 ]
좌 = 왼쪽 열이므로 [ j -1 ]
우 = 오른쪽 열이므로 [ j + 1 ]