🙇‍♀️봉우리

지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다.

각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다.

봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.

격자의 가장자리는 0으로 초기화 되었다고 가정한다.

만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.

스크린샷 2023-12-17 013101

▣ 입력설명
첫 줄에 자연수 N이 주어진다.(1<=N<=50)  

두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다.  
각 자연수는 100을 넘지 않는다. 

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

▣ 입력예제 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

🚀풀이

전형적인 완전 탐색 문제처럼 보였다.

N의 수가 작아서 모든 경우를 탐색하여 문제를 풀었다.

코드는 다음과 같다.

int N;
vector<vector<int>> board;

struct Pos
{
	bool operator==(Pos& other)
	{
		return y == other.y && x == other.x;
	}

	bool operator!=(Pos& other)
	{
		return !(*this == other);
	}

	bool operator<(const Pos& other) const
	{
		if (y != other.y)
			return y < other.y;
		return x < other.x;
	}

	Pos operator+(Pos& other)
	{
		Pos ret;
		ret.y = y + other.y;
		ret.x = x + other.x;
		return ret;
	}

	Pos& operator+=(Pos& other)
	{
		y += other.y;
		x += other.x;
		return *this;
	}

	int y;
	int x;
};

Pos front[4] =
{
	Pos { -1, 0}, // UP
	Pos { 0, -1}, // LEFT
	Pos { 1, 0},  // DOWN
	Pos { 0, 1},  // RIGHT
};

bool IsInside(Pos pos)
{
	if (pos.y < 0 || pos.x < 0)
		return false;
	if (pos.y > N - 1 || pos.x > N - 1)
		return false;

	return true;
}

void solve()
{
	cin >> N;
	board = vector<vector<int>>(N, vector<int>(N));

	for (int y = 0; y < N; ++y)
	{
		for (int x = 0; x < N; ++x)
		{
			cin >> board[y][x];
		}
	}

	int cnt = 0;
	for (int y = 0; y < N; ++y)
	{
		for (int x = 0; x < N; ++x)
		{
			Pos pos = { y ,x };
			bool flag = false;
			for (int dir = 0; dir < 4; ++dir)
			{
				Pos nextPos = pos + front[dir];

				if (IsInside(nextPos) && board[nextPos.y][nextPos.x] < board[y][x])
				{
					flag = true;
				}
				else if (IsInside(nextPos) && board[nextPos.y][nextPos.x] >= board[y][x])
				{
					flag = false;
					break;
				}
				
				if (IsInside(nextPos))
					flag = flag;
			}

			if (flag == true)
			{
				cnt++;
				//cout << "pos.y : " << pos.y << "  pos.x : " << pos.x << endl;
			}
		}
	}

	cout << cnt;
}

🚀전체 코드

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int N;
vector<vector<int>> board;

struct Pos
{
	bool operator==(Pos& other)
	{
		return y == other.y && x == other.x;
	}

	bool operator!=(Pos& other)
	{
		return !(*this == other);
	}

	bool operator<(const Pos& other) const
	{
		if (y != other.y)
			return y < other.y;
		return x < other.x;
	}

	Pos operator+(Pos& other)
	{
		Pos ret;
		ret.y = y + other.y;
		ret.x = x + other.x;
		return ret;
	}

	Pos& operator+=(Pos& other)
	{
		y += other.y;
		x += other.x;
		return *this;
	}

	int y;
	int x;
};

Pos front[4] =
{
	Pos { -1, 0}, // UP
	Pos { 0, -1}, // LEFT
	Pos { 1, 0},  // DOWN
	Pos { 0, 1},  // RIGHT
};

bool IsInside(Pos pos)
{
	if (pos.y < 0 || pos.x < 0)
		return false;
	if (pos.y > N - 1 || pos.x > N - 1)
		return false;

	return true;
}

void solve()
{
	cin >> N;
	board = vector<vector<int>>(N, vector<int>(N));

	for (int y = 0; y < N; ++y)
	{
		for (int x = 0; x < N; ++x)
		{
			cin >> board[y][x];
		}
	}

	int cnt = 0;
	for (int y = 0; y < N; ++y)
	{
		for (int x = 0; x < N; ++x)
		{
			Pos pos = { y ,x };
			bool flag = false;
			for (int dir = 0; dir < 4; ++dir)
			{
				Pos nextPos = pos + front[dir];

				if (IsInside(nextPos) && board[nextPos.y][nextPos.x] < board[y][x])
				{
					flag = true;
				}
				else if (IsInside(nextPos) && board[nextPos.y][nextPos.x] >= board[y][x])
				{
					flag = false;
					break;
				}
				
				if (IsInside(nextPos))
					flag = flag;
			}

			if (flag == true)
			{
				cnt++;
				//cout << "pos.y : " << pos.y << "  pos.x : " << pos.x << endl;
			}
		}
	}

	cout << cnt;
}

int main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}