티스토리 뷰

알고리즘

47. 봉우리

홍복치 2020. 12. 23. 22:28

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

입력예제 1

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

 

출력예제 1 

10

 

풀이 

2차원 배열 탐색 문제

2차원 배열의 한위치에서 상하좌우와 비교해 값이 더 크면 봉우리가 되고 이를 카운팅한다.

 

- 주의해야 할 점

(1) 범위가 n=50까지 들어갈 수 있기 때문에 배열 선언시에는 전역으로 a[51][51]

(2) flag값을 설정해서 상하좌우와 비교했을 때 기준이 되는 값보다 큰 값이 하나라도 나오면 바로 break하는 구문이 필요

 

 

- 생각해야 할 점

(1) 2차원 배열의 한 위치에서 어떻게 하면 상하좌우에 있는 값들과 비교할 수 있을지 생각하는 것이 중요

=> 처음에는 if문으로 모든 방향과 비교해야겠다고 생각했는데 이는 비효율적일 것이라는 생각이 듬

=> 행과 열의 이동을 배열로 담음

  a[i-1][j] :  -1, 0  
a[i][j-1] : 0, -1 기준값 a[i][j] a[i][j+1]: 0, 1
  a[i+1][j] : 1, 0  

시계 방향으로 dx는 [-1, 0, 1, 0], dy는 [0, 1, 0, -1]

 

(2) for문 두개로 배열의 모든 값들을 검사하고 그 안에서 또 다른 for문으로 4번씩 상하좌우와 비교해야 한다. 코드에서 for(k=0;k<4;k++)

 

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int a[51][51];
int dx[4]={-1, 0, 1, 0}; //시계 방향 행 변경
int dy[4]={0, 1, 0, -1}; //시계 방향 열 변경


// 47. 봉우리

int main() {
    int n, i, k, j, cnt=0, flag;
    scanf("%d", &n);
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            scanf("%d",&a[i][j]);
        }
    }
    
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            flag=0;
            for(k=0;k<4;k++){
                if(a[i][j]<=a[i+dx[k]][j+dy[k]]){
                    flag=1;
                    break;
                }
            }
            if(!flag) cnt++;
        }
    }
    printf("%d\n", cnt);
    return 0;
}

 

'알고리즘' 카테고리의 다른 글

49. 블록의 최댓값  (0) 2020.12.28
48. 각 행의 평균과 가장 가까운 값  (0) 2020.12.24
46. 멀티태스킹(카카오 먹방 문제 변형)  (0) 2020.12.22
45. 공주구하기  (0) 2020.12.21
44. 마구간 정하기  (0) 2020.12.18
최근에 올라온 글
Total
Today
Yesterday