문제 풀이/Baekjoon Online Judge

[Baekjoon - 4663] Instruens Fabulam

hibye1217 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