본문 바로가기

알고리즘

[C++] 백준 BOJ 3023 마술사 이민혁

문제링크 : https://www.acmicpc.net/problem/3023



배열을 입력받는 문자보다 크게 설정해 놓고 

그 배열 안에 좌우 대칭과 상하 대칭을 시키는건 누구나 생각하게된다.

그러나 막상 카드를 복사하려면 한번 생각보다 쉽지 않다고 느낄 수 있는

사람이 있을 거라고 생각한다.

내가 생각하는 이 문제의 키워드는 다음으로 정리했다.



① 카드복사의 방법

② 에러의 위치


1. 카드 복사의 방법


사실 상하를 먼저 할지 좌우를 먼저할지는 크게 상관은 없다.(결과가 같기 때문)

문제는 위치를 잡는데 있다. 

좌우 대칭을 기준으로 말하면 복사할 위치는 한칸씩 오른쪽으로 가면서

복사 기준이 되는 위치는 한칸씩 왼쪽으로 가면 된다.

이때 각각의 시작점만 잘 잡아주면 된다.



2. 에러의 위치


에러의 위치가 0부터 시작이 아니라 1부터 시작한다. 주의하자.



그렇게 작성한 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <queue>
#include <string>
#include <algorithm>
using namespace std;
char card[102][102];
int r, c;
int a, b;
void makeCard() {
    for (int i = 0; i < r; i++) {
        for (int j = c; j < 2 * c; j++) {
            card[i][j] = card[i][(c-1- (j - c)];
        }
    }
    for (int i = r; i < 2 * r; i++) {
        for (int j = 0; j < 2 * c; j++) {
            card[i][j] = card[(r-1)-(i-r)][j];
        }
    }
}
void changeCard() {
    if (card[a][b] == '.') {
        card[a][b] = '#';
    }
    else {
        card[a][b] = '.';
    }
}
void printCard() {
    for (int i = 0; i < 2 * r; i++) {
        for (int j = 0; j < 2 * c; j++) {
            cout << card[i][j];
        }
        cout << endl;
    }
}
int main() {
    cin >> r >> c;
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            cin >> card[i][j];
        }
    }
    cin >> a >> b;
    a--;
    b--;
    makeCard();
    changeCard();
    printCard();
}
cs



'알고리즘' 카테고리의 다른 글

[C++] 백준 BOJ 16236 아기 상어  (0) 2019.01.12
[C++] 백준 BOJ 7569 토마토  (0) 2019.01.10
[C++] 백준 BOJ 10815 숫자카드  (0) 2019.01.09