배열로 할 수도 있고 직접 출력을 할 수도 있지만 나는 직접 출력하는 방식을 택했다.
만약 배열로 한다면 세로로 보는 것이 편할 것 같다는 생각이다.
풀이
(1번 줄, 5번 줄), (2번 줄, 3번 줄)은 동일하다.
가로길이: 입력된 문자열 길이 * 4 + 1
세로 길이: 5
1번 줄:
-
'#' | '*'이 나오는 위치: 3 7 11 ··· -> i % 4 == 3
- *이 나오는 위치: 11 23 ··· -> i % 12 == 11
-
나머지는 '.'출력
2번 줄:
-
'#' | '*'이 나오는 위치: 짝수 -> i % 2 == 0
- '*'이 나오는 위치: 10 12 22 24 ··· -> i % 12 == 10 | i % 12 == 0
-
나머지는 '.' 출력
가운데:
얘는 까다로워서 문자열 길이에 따라 다른 조건을 적용했다.
'#' | '*'이 나오는 위치는 1 5 9 ···로 i % 4 == 1이다.
-
문자열 길이가 3의 배수일 때
- '*'가 나오는 위치: 9 13 21 25 ···로 i % 12 == 9 || i % 12 == 1로 나타낼 수 있지만 i = 1일땐 안 되므로 && i != 1 조건을 붙여준다.
- 나머지는 # 출력
-
문자열 길이가 3의 배수가 아닌 경우
- '*'가 나오는 위치: 위의 식과 동일하지만 조건을 하나 더 붙여줘야 할 게 있다. DO의 경우 *이 출력되면 안되지만 위의 경우를 그대로 사용하면 *이 출력되기 때문에 i != 4 * len + 1의 조건을 붙여서 #이 출력되도록 한다.
- 나머지는 # 출력
문자가 나오는 위치: 3 7 11 ··· -> i % 4 == 3
나머지: '.' 출력
코드
#include <cstdio>
#include <cstring>
char str[16];
int len;
void lineF()
{
for (int i = 1; i <= 4 * len + 1; ++i)
{
if (i % 4 == 3)
{
if (i % 12 == 11)
putchar('*');
else
putchar('#');
}
else
putchar('.');
}
putchar('\n');
}
void lineN()
{
for (int i = 1; i <= 4 * len + 1; ++i)
{
if (i % 2 == 0)
{
if (i % 12 == 10 || i % 12 == 0)
putchar('*');
else
putchar('#');
}
else
putchar('.');
}
putchar('\n');
}
void lineM()
{
int idx = 0;
for (int i = 1; i <= 4 * len + 1; ++i)
{
if (i % 4 == 1)
{
if (len % 3 == 0)
{
if ((i % 12 == 9 || i % 12 == 1) && i != 1)
putchar('*');
else
putchar('#');
}
else
{
if ((i % 12 == 9 || i % 12 == 1) && i != 4 * len + 1 && i != 1)
{
putchar('*');
}
else
putchar('#');
}
}
else if (i % 4 == 3)
putchar(str[idx]), idx++;
else
putchar('.');
}
putchar('\n');
}
int main()
{
scanf("%s", str);
len = strlen(str);
lineF();
lineN();
lineM();
lineN();
lineF();
return 0;
}
'온라인저지' 카테고리의 다른 글
[BOJ] 1193번: 분수찾기 (0) | 2018.07.19 |
---|---|
[BOJ] 3053번: 택시 기하학 (0) | 2018.07.19 |
[BOJ] 3052번: 나머지 (0) | 2018.07.19 |
[BOJ] 3055번: 탈출 (0) | 2018.07.19 |
[BOJ] 3046번: R2 (0) | 2018.07.19 |
[BOJ] 3047번: ABC (0) | 2018.07.19 |
댓글