728x90
SMALL
백준 문제 풀이: 1996 (지뢰 찾기)
문제 링크: https://www.acmicpc.net/problem/1996
문제 설명:
지뢰찾기 게임에서 주어진 n × n 크기의 격자에서 각 칸에 대한 정보를 출력합니다. - 지뢰는 '*'로 표시됩니다. - 지뢰가 없는 칸에서는 인접한 8방향 칸에 포함된 지뢰의 수를 출력합니다. - 인접한 지뢰의 수가 10 이상이면 'M'으로 표시됩니다.
문제 해결 코드
#include <iostream>
#include <string>
using namespace std;
int arr[1001][1001];
// 8방향 이동을 위한 배열
int dx[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
int dy[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
// 격자 입력 처리
for (int i = 0; i < n; i++) {
string s;
cin >> s;
for (int j = 0; j < s.size(); j++) {
if (s[j] == '.') {
arr[i][j] = 0; // 지뢰가 없는 칸
} else {
arr[i][j] = s[j] - '0'; // 지뢰의 값
}
}
}
// 결과 계산 및 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr[i][j] > 0) {
cout << "*"; // 지뢰 칸은 '*'로 출력
} else {
int cnt = 0; // 인접한 지뢰의 합
for (int t = 0; t < 8; t++) {
int nx = i + dx[t];
int ny = j + dy[t];
if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue; // 격자 밖 무시
if (arr[nx][ny] > 0) {
cnt += arr[nx][ny];
}
}
// 출력 조건
if (cnt >= 10) {
cout << "M";
} else {
cout << cnt;
}
}
}
cout << '\n'; // 다음 행 출력
}
return 0;
}
코드 설명
코드의 주요 로직과 사용된 알고리즘 설명:
- 핵심 알고리즘: 주어진 지뢰 정보를 바탕으로 8방향 탐색을 통해 각 칸의 상태를 계산합니다.
- 구현 세부사항:
dx[], dy[]
: 8방향 탐색을 위한 방향 벡터입니다.- 격자 탐색: 지뢰인 칸은 '*'로, 지뢰가 없는 칸은 인접 지뢰 합으로 표시합니다.
- 인접 지뢰 합이 10 이상이면 'M'으로 표시합니다.
- 시간 복잡도 분석:
- 격자를 순회하며 각 칸에서 최대 8방향을 탐색하므로 O(n²)입니다.
- n의 최대값은 1000이므로 문제를 효율적으로 해결할 수 있습니다.
결과
격자의 각 칸에 대해 지뢰 여부와 인접 지뢰 합을 정확히 계산하여 출력합니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 구현' 카테고리의 다른 글
백준 26265번 [멘토와 멘티](C++) -yes6686- 티스토리 (0) | 2024.07.26 |
---|---|
백준 2002번 [추월](C++) -yes6686- 티스토리 (0) | 2024.07.23 |
백준 31066번 [비 오는 날](C++) -yes6686- 티스토리 (0) | 2024.07.21 |
백준 20299번 [3대 측정](C++) -yes6686- 티스토리 (0) | 2024.07.19 |
백준 20361번 [일우는 야바위꾼](C++) -yes6686- 티스토리 (0) | 2024.07.16 |