습관처럼

백준 3023 - 마술사 이민혁 본문

Algorithms/BOJ

백준 3023 - 마술사 이민혁

dev.wookii 2020. 4. 13. 16:42

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

 

3023번: 마술사 이민혁

문제 유명한 마술사인 이민혁이 사용하는 카드의 뒷 면은 모두 자신이 디자인한 카드이다. 민혁이는 카드 뒷 면 전체를 디자인하지 않고, 왼쪽 위 1/4만 디자인한다. 그 다음 대칭시켜 오른쪽 위를 만들고, 다시 대칭시켜서 아래 부분을 모두 만든다. 이렇게 대칭시켜서 전체를 디자인 한 이후에는, 마술하는데 사용하기 위한 의도된 에러를 넣는다. 에러는 원래 '#'이어야 하는 칸을 '.'로 바꾸거나 '.'이어야 하는 칸을 '#'로 바꾸는 것이다. 왼쪽 위의 디자

www.acmicpc.net

문제 설명


카드 뒷 면 전체를 디자인하지 않고, 왼쪽 위 1/4만 디자인한다. 그 다음 대칭시켜 오른쪽 위를 만들고, 다시 대칭시켜서 아래 부분을 모두 만든다.

 

 

접근 방법


대칭하는 방법을 알고 있다면 쉽게 해결가능할 것입니다.  

또한, algorithm의 reverse를 이용하면 대칭 구현하기가 더 쉽습니다.

2020/04/21 - [Language/C++] - C++ - n x n 2차원 배열에 대한 조작 (90도 회전 / 점대칭 / 선대칭)

 

 

코드


#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;
int r,c;
int main(void) {
	cin>>r>>c;
	string str[2*r];
	for(int i=0;i<r;i++) cin>>str[i];	
	for(int i=0;i<r;i++){
		for(int j=c-1;j>=0;j--){
			str[i]+=str[i][j];
		}
	}
	for(int i=0;i<r;i++){
		str[2*r-1-i]=str[i];
	}
	int y,x;
	cin>>y>>x;
	if(str[y-1][x-1]=='#') str[y-1][x-1]='.';
	else str[y-1][x-1]='#';
	for(int i=0;i<2*r;i++) cout<<str[i]<<"\n";
	
	
	return 0;
}
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(void)
{
	int r, c, a, b;
	string parts[50];
	string card[100];
	cin >> r >> c;
	for (int i = 0; i < r; i++)
		cin >> parts[i];
	cin >> a >> b;

	for (int i = 0; i < r; i++)
	{
		string tmp = parts[i];
		reverse(tmp.begin(), tmp.end());
		card[i] = parts[i] + tmp;
	}
	for (int i = 0; i < r; i++)
		card[r * 2 - 1 - i] = card[i];
	if (card[a - 1][b - 1] == '#')
		card[a - 1][b - 1] = '.';
	else
		card[a - 1][b - 1] = '#';

	for (int i = 0; i < r * 2; i++)
		cout << card[i] << '\n';
}

funny algorithm *0*~

'Algorithms > BOJ' 카테고리의 다른 글

백준 15683 - 감시  (0) 2020.05.01
백준 14891 - 톱니바퀴  (0) 2020.04.30
백준 14890 - 경사로  (0) 2020.04.13
백준 3085 - 사탕 게임  (0) 2020.04.13
백준 2468 - 안전 영역  (0) 2020.04.10