본문 바로가기

백준

3054)피터팬 프레임

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


피터팬 프레임을 만들기 위해 i와 j값에 따라 '.'이나 '#'을 찍는 것은 어렵다.


그래서 미리 피터팬 프레임과 웬디 프레임을 만들어 두고 스탬프처럼 찍는 것을 생각했다.



이 때 두 가지 정도 생각해봐야 할 것이 있다.


첫째로 프레임을 담아낼 배열의 크기는 프레임이 겹친다는 것을 고려해야 한다.


프레임 배열의 열 길이 = (웬디 or 피터팬 프레임)열 길이 + (열 길이-1) * 단어의 길이 +1(NULL)


프레임 배열의 행 길이 = (웬디 or 피터팬 프레임)행 길이


둘째로 피터팬 프레임과 웬디 프레임이 겹칠 때 웬디 프레임을 위로 드러내야 한다는 것이다.


위 방식은 프레임을 스탬프를 찍을 때 이전 프레임이 덧씌우진다는 문제가 있다.


그래서 웬디 프레임일 때 피터팬 프레임을 덧씌우지 않아야 한다.


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
#include<stdio.h>
#define ROW 5
#define COL 5
 
int main() {
    char peterFrame[5][6= { {"..#.."},{".#.#."},{"#.X.#"},{".#.#."},{"..#.."} };
    char wendyFrame[5][6= { {"..*.."},{".*.*."},{"*.X.*"},{".*.*."},{"..*.."} };
    char word[16];
    char **framedWord;
    int frameCol;
    int wordLen = 0;
    int k,t = 0;
 
    scanf("%s",word);
    for (int i = 0; word[i] != NULL;i++) {
        wordLen++;
    }
 
    frameCol = COL + (COL-1)*(wordLen-1);
    framedWord = (char **)malloc(sizeof(char *)*ROW);
    for (int i = 0; i < ROW;i++){
        framedWord[i] = (char *)malloc(sizeof(char)*(frameCol+1));
    }
 
    for (int i = 1; i<wordLen+1; i++) {
        for (int j = 0; j < ROW; j++) {
            for (k = t; k < t + COL; k++) {
                if (i%3 != 0) {
                    if(framedWord[j][k] != '*') framedWord[j][k] = peterFrame[j][k - t];
                }
                else framedWord[j][k] = wendyFrame[j][k-t];
            }
            framedWord[j][k] = NULL;
        }
        framedWord[ROW/2][t+COL/2= word[i-1];
        t = k - 1;
    }
 
    for (int i = 0; i < ROW;i++) {
        printf("%s\n",framedWord[i]);
    }
 
    system("pause");
    return 0;
}
cs



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

2810)컵홀더  (0) 2019.02.06
5612)터널의 입구와 출구  (0) 2019.02.06
11047)동전 0  (0) 2019.02.04
1003)피보나치 함수  (0) 2019.02.04
3023)마술사 이민혁  (0) 2019.02.04