[백준 BOJ] 4108번 지뢰찾기 (C++/cpp)

2022. 8. 16. 15:27PS (Program Solving)/BOJ (백준)

문제 설명

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

 

4108번: 지뢰찾기

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

www.acmicpc.net

백준 BOJ 4108번 지뢰찾기 문제 사진1
백준 BOJ 4108번 지뢰찾기 문제 사진2

 

접근 방법 - 다중 반복문을 이용한 탐색 문제

백준의 4108번 문제는 다중 반복문을 이용하여 해결해야 하는 문제이다.

해당 문제는, 입력받은 지뢰판을 토대로 하여 각 위치에 따른 인접한 지뢰의 개수를 순차적으로 출력해야 하는 문제이다.

이 글에서 작성한 필자의 코드는 무한 반복문을 통해 각 테스트 케이스들을 다루고 다중 반복문을 통해 인접한 지뢰의 개수를 카운팅 하도록 하였다.

지금 생각하면 더 좋은 방법이 있지 않았을까 싶었지만, 우선은 해당 코드를 위주로 설명하고자 한다.

해당 문제를 해결하는 데에 어려움을 겪고 있었다면, 아래 필자의 코드와 설명을 한번 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

- 무한 반복문을 통하여 각 테스트 케이스들을 다루도록 한다.

 

1) 지뢰판의 가로(n) 및 세로(m), 그리고 지뢰판의 지뢰 위치(arr)를 입력받는다.

여기서, '.'(점)을 입력받았을 때엔 해당 배열값을 문자 '0'로 저장하도록 한다.

추후에 지뢰의 개수, 즉 숫자를 출력할 때 더 원활하게 하기 위함이다.

 

2) 입력을 모두 마쳤을 시엔, 이중 반복문을 통하여 arr의 값들을 순차적으로 탐색한다.

- 현재 탐색값이 '*'(별)일 경우, 현재 위치를 기점으로 하여 상하좌우 대각선 상의 위치들에 모두 1씩 더하도록 한다.

(필자의 경우엔 이 과정 또한 이중 반복문으로 수행하게끔 하였는데, 이때 배열의 최소 및 최대 범위를 벗어나지 않도록 주의한다.)

 

3) 하나의 테스트 케이스에 대하여 모든 연산이 끝났을 경우, 최종적으로 저장된 arr의 값들을 순차적으로 출력한다.

('*'(별)은 출력 예시에서 그대로 출력되어있기 때문에, 이에 대한 연산은 따로 취하지 않았다.)

 

4) 1)에서 가로 및 세로의 값을 0 0으로 입력받을 때까지, 2) ~ 3) 과정을 반복한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;

//백준 4108번 코드
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	while (1) {
		char arr[100][100] = { 0 };
		int n, m;
		cin >> n >> m;
		if (n == 0 && m == 0) { break; }
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				cin >> arr[i][j];
				if (arr[i][j] == '.') {
					arr[i][j] = '0';
				}
			}
		}

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (arr[i][j] == '*') {
					for (int a = -1; a <= 1; a++) {
						for (int b = -1; b <= 1; b++) {
							if (i + a < 0 || j + b < 0 || i + a >= n || j + b >= m) { continue; }
							if (arr[i + a][j + b] != '*') {
								arr[i + a][j + b]++;
							}
						}
					}
				}
			}
		}

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				cout << arr[i][j];
			}
			cout << endl;
		}
	}
}

 

제출 결과

백준 BOJ 4108번 지뢰찾기 문제 C++ 제출 결과

(2022.04.27 백준 4108번 문제 제출 결과)

반응형