본문 바로가기

백준

3023)마술사 이민혁

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


패턴을 입력받는다.


패턴을 좌상단에 위치시킨 뒤 이리저리 대칭시켜 전체 패턴의 모습을 결정한다.

위 그림은 좌상단 패턴을 y축 대칭시켜 우상단 패턴의 모습을 결정했다.

좌상단 패턴을 x축에 대칭시켜 좌하단 패턴의 모습을 결정했다.


어떻게 해야 x,y축 대칭시킨 패턴을 얻을 수 있을까?


아래와 같은 반복 구조를 사용하면서 부분 패턴을 대입해 전체 패턴을 채워야 한다.

 


j가 차례대로 증가할 때 부분 패턴의 인덱스(그림에서 '?')는 거울에 비친것처럼 대칭적으로 멀어져야 한다.


부분 패턴의 인덱스를 k라고 할 때 거울에 비친것처럼 j와 대칭적으로 움직이는 관계가 있다.


이 관계를 찾기 위해 j와 k를 표로 나타내자.

k와 j의 인덱스 관계를 찾기 위해 이리저리 변수들을 만지다 보면 k = (2*C-1)-j 가 나온다.


이는 x축 대칭시킬 때도 똑같아서 C를 R로 바꿔주기만 하면 된다.



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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<stdio.h>
 
void fillPattern(char **full, char **part, int R, int C) {
    for (int i = 0; i < R;i++) {
        for (int j = 0; j < C; j++) {
            full[i][j] = part[i][j];
        }
    }
 
    for (int i = 0; i < R; i++) {
        for (int j = C; j < 2 * C; j++) {
            full[i][j] = part[i][(2*C-1)-j];
        }
    }
 
    for (int i = R; i < 2 * R; i++) {
        for (int j = 0; j < C; j++) {
            full[i][j] = part[(2*R-1)-i][j];
        }
    }
 
    for (int i = R; i < 2*R; i++) {
        for (int j = C; j < 2*C; j++) {
            full[i][j] = part[(2*R-1)-i][(2*C-1)-j];
        }
    }
 
    for (int i = 0; i < 2*R; i++) {
        full[i][2*C] = NULL;
    }
}
 
int main() {
    int R, C;
    int errorX, errorY;
    char **partPattern;
    char **fullPattern;
 
    scanf("%d %d",&R,&C);
 
    partPattern = (char **)malloc(sizeof(char *)*R);
    for (int i = 0; i < R;i++) {
        partPattern[i] = (char *)malloc(sizeof(char)*(C+1));
    }
 
    fullPattern = (char **)malloc(sizeof(char *)*R*2);
    for (int i = 0; i < R*2; i++) {
        fullPattern[i] = (char *)malloc(sizeof(char)*(C*2+1));
    }
 
    for (int i = 0; i < R;i++) {
        scanf("%s", partPattern[i]);
    }
    scanf("%d %d",&errorX, &errorY);
    errorX -= 1; errorY -= 1;
 
    fillPattern(fullPattern, partPattern, R, C);
 
    if (fullPattern[errorX][errorY] == '#') {
        fullPattern[errorX][errorY] = '.';
    }
    else {
        fullPattern[errorX][errorY] = '#';
    }
 
    for (int i = 0; i < 2 * R; i++) {
        printf("%s\n", fullPattern[i]);
    }
 
    return 0;
}
cs



 

'백준' 카테고리의 다른 글

11047)동전 0  (0) 2019.02.04
1003)피보나치 함수  (0) 2019.02.04
2033)반올림  (0) 2019.02.04
1912)연속합  (0) 2019.02.04
2804)크로스워드 만들기  (0) 2019.02.03