본문 바로가기
온라인저지

[BOJ] 3054번: 피터팬 프레임

by plzfday 2018. 7. 19.

3054번: 피터팬 프레임

배열로 할 수도 있고 직접 출력을 할 수도 있지만 나는 직접 출력하는 방식을 택했다.

만약 배열로 한다면 세로로 보는 것이 편할 것 같다는 생각이다.

풀이

(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

댓글