해결방법
크게 두 부분으로 나눠서 분석할 수 있다.
지뢰의 수와 위치를 입력받는 부분, 지뢰가 주위에 얼마나 있는지 분석하는 부분이다.
int N;
cin >> N;
vector<vector<char>> vec(N, vector<char>(N));
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> vec[i][j];
}
}
먼저 지뢰의 수와 위치를 입력받는 부분을 살펴보면 N값을 입력받고, Vector를 이용하여 N*N배열을 만들고 입력을 받는다는 것을 알 수 있다.
그다음 지뢰를 분석하는 부분인데, 지뢰가 감지되면 result에 숫자 대신 '*'을 입력하는 식으로 처리를 하고, 주위 8방향을 탐색하여 지뢰가 있다면 개수를 세서 mine_count에 더해준다. 만약 mine_count가 10이 넘는다면 M으로 표기해준다.
정답 코드
#include <iostream>
#include <vector>
using namespace std;
int dx[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int dy[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
int main()
{
int N;
cin >> N;
vector<vector<char>> vec(N, vector<char>(N));
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> vec[i][j];
}
}
vector<vector<char>> result(N, vector<char>(N, '0'));
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (vec[i][j] >= '1' && vec[i][j] <= '9')
{
result[i][j] = '*';
continue;
}
int mine_count = 0;
for (int dir = 0; dir < 8; dir++)
{
int ni = i + dx[dir];
int nj = j + dy[dir];
if (ni >= 0 && ni < N && nj >= 0 && nj < N)
{
if (vec[ni][nj] >= '1' && vec[ni][nj] <= '9')
{
mine_count += (vec[ni][nj] - '0');
}
}
}
if (mine_count >= 10)
{
result[i][j] = 'M';
}
else if (mine_count > 0)
{
result[i][j] = mine_count + '0';
}
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cout << result[i][j];
}
cout << endl;
}
return 0;
}
'코딩테스트' 카테고리의 다른 글
BOJ - 1934 최소공배수 (0) | 2024.10.07 |
---|---|
BOJ - 10812 바구니 순서 바꾸기 (0) | 2024.10.04 |
BOJ - 18229 내가 살게, 아냐 내가 살게 (0) | 2024.09.30 |
BOJ - 1978 소수 찾기 (0) | 2024.09.26 |
BOJ - 2231 분해합 (0) | 2024.09.26 |