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 |