본문 바로가기

CodingTest Exam/[C++] Algorithm Study

47. 봉우리(2차원 배열 탐색) (it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비) ★★☆☆☆

#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 ]