it 취업을 위한 알고리즘 문제풀이 입문 : 47. 봉우리
🙇♀️봉우리
지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다.
각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다.
봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.
▣ 입력설명
첫 줄에 자연수 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;
}