[백준] 4396: 지뢰 찾기

Hyeonsol Kong·2022년 4월 6일
0

백준

목록 보기
4/16
post-custom-banner

문제 링크

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

접근 방식 / 풀이

문제에서 주어지는 것은 두 가지이다.

  1. 지뢰의 위치
  2. 플레이어가 누른 위치

이 상태에서 결과도 두 가지가 나오는데,

  1. 플레이어가 지뢰를 누른 상태
  2. 플레이어가 지뢰를 누르지 않은 상태

위 두 경우의 차이점은, 1번은 지뢰의 위치를 보여주는 반면, 2번은 지뢰의 위치를 보여주지 않는다는 차이점이 있다. 따라서 이 점을 잘 고려하며 문제를 해결해야 한다.

먼저, 지뢰의 위치를 다 입력받은 뒤 사용자가 지뢰를 눌렀는 지 아닌 지를 판단한다.
사용자가 누른 입력이 한 줄씩 들어올 때마다 opened && 지뢰를 확인하여 지뢰를 눌렀다면 int boom = 1 으로 플래그를 설정해둔다. 한 번 지뢰를 눌렀음이 판단되면 이후에는 굳이 재확인을 해줄 필요는 없기 때문에 시간 낭비를 줄이기 위해 if문을 한 번 넣어주었다.

입력이 성공적으로 이뤄진 이후, for문으로 n2n^2번 배열을 돌면서 확인을 해준다.

사용자가 누른 곳이 지뢰인 경우,
지뢰는 터졌고, 모든 지뢰를 보여줘야 하기 때문에 지뢰를 return해야 한다.
반면, 지뢰가 아닌 경우에는 주변의 지뢰 (8방향)을 다 둘러본 뒤 주변에 지뢰가 몇 개인 지 체크하여 해당 숫자를 return해야 한다.

사용자가 누르지 않았지만, 지뢰가 터진 경우에는 원래의 map을 출력해도 무방하며,
사용자가 누르지 않았지만, 지뢰가 터지지 않은 경우에는 전부 .을 출력해줘야 한다.


답안 코드 링크 (Github)

Github Solution Link

정답 코드 (C++)

#include <iostream>
#include <string>

using namespace std;

char	map[11][11];
char	opened[11][11];
int		n, boom;

void	fastio(void);
int		check(int i, int j);

int main(void)
{
	fastio();
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> map[i];
	for (int i = 0; i < n; i++)
	{
		cin >> opened[i];
		if (!boom)
		{
			for (int j = 0; j < n; j++)
				if (opened[i][j] == 'x' && map[i][j] == '*')
				{	boom = 1;	break;	}
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n ; j++)
		{
			if (opened[i][j] == 'x')
			{
				if (map[i][j] == '*')
					cout << map[i][j];
				else
				 	cout << (char)(check(i, j) + '0');
			}
			else if (boom)
				cout << map[i][j];
			else
				cout << ".";
		}
        cout << "\n";
	}
	return (0);
}

int	check(int i, int j)
{
	int	dir[8][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
	int	x, y, check = 0;

	for (int k = 0; k < 8; k++)
	{
		x = i + dir[k][0];
		y = j + dir[k][1];
		if (x >= 0 && y >= 0 && x < n && y < n)
		{
			if (map[x][y] == '*')
				check++;
		}
	}
	return (check);
}


void	fastio(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
}
post-custom-banner

0개의 댓글