[C++] 백준 23038번: 박스 그림 문자

be_clever·2022년 1월 18일
0

Baekjoon Online Judge

목록 보기
34/172

문제 링크

23038번: 박스 그림 문자

문제 요약

박스 그림 문자를 통해서 만든 모양 중에 선이 끊어진 곳이 없는 모양을 '아름다운 모양'이라고 한다. 어떤 모양이 주어졌을때, 이를 아름다운 모양으로 만들어야 한다.

접근 방법

정말 쉬운 구현 문제였습니다.

주어진 입력을 3 * 3 단위의 모양으로 쪼개서 저장을 합니다. 조건을 보면 i+ji + j가 홀수인 경우에만 해당 공간이 비어있게 됩니다. 따라서 i+ji + j가 홀수인 경우에만 상하좌우의 인접한 모양을 확인해줍니다. 인접한 모양이 경계 부분에 '#'를 가지고 있는지 확인을 해보면 됩니다. 만약 '#'가 존재한다면 현재 모양의 인접한 그 부분에 '#'을 추가해주면 됩니다.

마지막으로 현재 모양에 '#'가 존재한다면 중앙에 '#'를 추가해주면 됩니다.

코드

#include <bits/stdc++.h>
#define MAX 301

using namespace std;

struct Block {
	char arr[3][3];
}block[MAX][MAX];

int n, m;

void func(int r, int c)
{
	if (r != 1 && block[r - 1][c].arr[2][1] == '#')
		block[r][c].arr[0][1] = '#';
	if (c != 1 && block[r][c - 1].arr[1][2] == '#')
		block[r][c].arr[1][0] = '#';

	if (r != n && block[r + 1][c].arr[0][1] == '#')
		block[r][c].arr[2][1] = '#';
	if (c != m && block[r][c + 1].arr[1][0] == '#')
		block[r][c].arr[1][2] = '#';

	bool flag = false;
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			if (block[r][c].arr[i][j] == '#')
				flag = true;

	if (flag)
		block[r][c].arr[1][1] = '#';
}

int main(void)
{
	cin >> n >> m;

	for (int i = 0; i < 3 * n; i++)
		for (int j = 0; j < 3 * m; j++)
			cin >> block[i / 3 + 1][j / 3 + 1].arr[i % 3][j % 3];

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if((i + j) % 2 == 1)
				func(i, j);

	for (int i = 0; i < 3 * n; i++)
	{
		for (int j = 0; j < 3 * m; j++)
			cout << block[i / 3 + 1][j / 3 + 1].arr[i % 3][j % 3];
		cout << '\n';
	}
	return 0;
}
profile
똑똑해지고 싶어요

0개의 댓글