문제
지도 정보가 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를 더해주면 상하좌우를 탐색한다고 볼 수 있습니다.
'알고리즘 > it 취업을 위한 알고리즘 문제풀이' 카테고리의 다른 글
49. 블록의 최댓값 (0) | 2021.05.27 |
---|---|
48. 각 행의 평균과 가장 가까운 값 (0) | 2021.05.26 |
46. 멀티 태스킹 (카카오 "먹방" 문제 변형) (0) | 2021.05.26 |
45. 공주 구하기 (1) | 2021.05.25 |
44. 마구간 정하기 (이분검색 응용) (0) | 2021.05.25 |