문제 풀이/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[0] in "<=>*": 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*m - 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*m - 1) + "@")
|
cs |