※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 4108번 문제인 지뢰찾기이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/4108 

 

4108번: 지뢰찾기

C개의 문자들이 포함된 R개의 줄을 출력한다. 단, 모든 '.' 대신 인접한 칸에 위치한 지뢰의 수로 변경해 출력한다. '*' 칸은 그대로 출력한다. 문자 사이에 공백이나 줄 사이에 공백 줄이 있어선

www.acmicpc.net

각 칸의 인접 지뢰를 세는 배열을 먼저 준비하자. 그리고 각 지뢰칸마다 인접한 8방향의 칸에 인접 지뢰의 개수를 1씩 늘려 지뢰가 아닌 칸의 인접 지뢰 개수를 전부 구하자.

 

문제의 답은 지뢰칸의 경우 애스터리스크('*')를, 아닌 경우 위에서 구한 인접 지뢰의 개수를 이용해 출력할 수 있다.

 

아래 구현에서와 같이 dr, dc 등의 배열을 이용하면 8방향의 칸을 살피는 구현을 간략하게 할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int R, C;
string board[100];
int ans[100][100];

int dr[8] = { 1,1,1,0,-1,-1,-1,0 };
int dc[8] = { 1,0,-1,-1,-1,0,1,1, };

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> R >> C;
	while (R + C) {
		for (int r = 0; r < R; r++) {
			cin >> board[r];
			for (int c = 0; c < C; c++) ans[r][c] = 0;
		}

		for (int r = 0; r < R; r++) {
			for (int c = 0; c < C; c++) {
				if (board[r][c] == '*') {
					for (int k = 0; k < 8; k++) {
						int rr = r + dr[k], cc = c + dc[k];
						if (rr < 0 || rr >= R || cc < 0 || cc >= C) continue;
						ans[rr][cc]++;
					}
				}
			}
		}

		for (int r = 0; r < R; r++) {
			for (int c = 0; c < C; c++) {
				if (board[r][c] == '*') cout << '*';
				else cout << ans[r][c];
			}
			cout << '\n';
		}

		cin >> R >> C;
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1750 // C++] 서로소의 개수  (1) 2024.01.03
[BOJ 2436 // C++] 공약수  (1) 2024.01.02
[BOJ 2624 // C++] 동전 바꿔주기  (1) 2023.12.31
[BOJ 3077 // C++] 임진왜란  (0) 2023.12.30
[BOJ 3075 // C++] Astromeeting  (1) 2023.12.29

+ Recent posts