[백준 BOJ] 23841번 데칼코마니 (C++/cpp)

2023. 7. 16. 16:46PS (Program Solving)/BOJ (백준)

문제 설명

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

 

23841번: 데칼코마니

첫 줄에 그림의 세로 길이 정수 N과 가로 길이 정수 M이 주어진다. (1 ≤ N, M ≤ 50, M은 짝수) N개 줄에 M개씩 그림에 대한 정보가 주어진다. 물감은 26가지가 있고, 각각 알파벳 대문자 하나로 나타

www.acmicpc.net

백준 BOJ 23841번 데칼코마니 문제 사진
백준 BOJ 23841번 데칼코마니 문제 사진2

 

접근 방법 - 2차원 배열 응용문제

백준의 23841번 문제는 2차원 배열을 응용하여 정답을 출력해야 하는 문제이다.

해당 문제는, 물감이 묻힌 종이를 반으로 접었을 때 나타나는 모양을 출력하면 되는 문제이다.

예제를 살펴보면, 가로 상에서의 중심선을 기점으로 양 옆으로 대칭인 점을 볼 수 있을 것이다.

이 점을 이용하여 필자는, 2차원 배열에 종이의 상태를 입력받고, 물감이 칠해진 공간을 탐색할 때 이에 대칭되는 공간의 값도 변경하는 식으로 연산을 수행하였다.

이때, 문제 상에서 "그림을 접었을 때 두 물감이 겹치는 경우는 없다."라고 명시되어 있기 때문에, 이 점도 함께 참고하면 될 것이다.

자세한 점은 아래에 설명을 기재하니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해 보길 바란다.

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

 

코드의 실행 순서

1) 종이의 상태를 입력받을 2차원 배열(pic)을 전역 변수로 선언해 둔다.

 

2) 종이의 면적(n, m), 그리고 종이의 상태(pic)를 순차적으로 입력받는다.

 

3) pic의 값들을 탐색하면서, 아래의 연산을 수행하였다.

- 현재 탐색하고 있는 값이 '.'이 아니라면, 이 공간에 이미 물감이 칠해져 있음을 의미한다.

따라서, 가로 상 중심선을 기점으로 대칭되는 공간의 값을 이와 동일한 값으로 변경하도록 한다.

 

4) 3)의 연산이 모두 완료되었다면, 최종적으로 저장된 pic의 값을 순차적으로 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

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

//백준 23841번 코드
char pic[51][51];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> pic[i][j];
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (pic[i][j] != '.') {
				pic[i][m - j - 1] = pic[i][j];
			}
		}
	}

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

 

제출 결과

백준 BOJ 23841번 데칼코마니 문제 C++ 제출 결과

(2022.12.19 백준 23841번 문제 제출 결과)

반응형