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 |