ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Baekjoon - 4663] Instruens Fabulam
    문제 풀이/Baekjoon Online Judge 2023. 2. 14. 16:47

    난이도: Gold II

     

    태그

    더보기
    • Implementation
    • Parsing

     

    풀이

    1. 구현 디테일

    더보기

    문제를 풀기 위해서 해야 할 스텝은 다음과 같습니다.

     

    입력받기 → '&'를 기준으로 나누기 → 각각의 문자열을 Alignment에 맞게 적절히 출력 + 중간중간에 표 테두리 출력

     

    그런데 Alignment에 어떻게 잘 맞출까요?

    그 Column에 있는 문자열들 중, 가장 긴 문자열의 길이를 l이라고 해봅시다.

    저희가 지금 출력해야 하는 문자열은 s고, Alignment 방향은 d라고 합시다.

     

    그럼, d가 '<'라면 문자열의 오른쪽에 공백을 적절히 달아주면 됩니다.

    '>'라면 왼쪽에 잘 달아주면 되겠죠.

    '='이라면, 양쪽에 적당히 달아주면 됩니다.

     

    표 테두리 출력하는 건, 별찍기 느낌으로 잘 돌려주면 됩니다.

    '@'를 하나 출력한 뒤, '-'를 (Column의 길이 + " | "의 길이 × 등장 횟수 + "| "와 " |"의 길이 - '@'의 등장 횟수)번 출력하고, 마지막에 '@'을 하나 더 출력해주면 되죠.

     

    사실 가장 중요한 구현 디테일은, 각각의 표가 어디부터 어디까지인지 / 이를 토대로 입력을 언제 멈춰야 할지인데,

    다음 줄을 입력받은 뒤에야 이게 다음 표의 시작인지 아닌지 판별할 수 있으므로

    입력이 밀리지 않게 잘 조정해줘야 합니다.

     

    2. 코드

    더보기
    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
    def f(s, d, l):
        sl = len(s)
        if d == '<'return s + " "*(l-sl)
        if d == '>'return " "*(l-sl) + s
        if d == '='return " "*( (l-sl)//2 ) + s + " "*( (l-sl+1)//2 )
     
    inp = input().strip()
    while True:
        if inp == "*": break
        dir = inp; m = len(dir)
        arr = []
        while True:
            inp = input().strip()
            if inp[0in "<=>*": break
            arr.append( inp.split('&') )
        mx = [0 for i in range(m)]
        for a in arr:
            for j in range(m): mx[j] = max(mx[j], len(a[j]))
        print("@" + "-"*(sum(mx) + 3*- 1+ "@")
        for i in range(len(arr)):
            print("| ", end='')
            for j in range(m):
                print(f(arr[i][j], dir[j], mx[j]), end='')
                if j+1 != m: print(" | ", end='')
            print(" |")
            if i == 0:
                print("|-", end='')
                for j in range(m):
                    print("-"*(mx[j]), end='')
                    if j+1 != m: print("-+-", end='')
                print("-|")
        print("@" + "-"*(sum(mx) + 3*- 1+ "@")
    cs
Designed by Tistory.