-
[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. 코드
더보기1234567891011121314151617181920212223242526272829303132def f(s, d, l):sl = len(s)if d == '<': return s + " "*(l-sl)if d == '>': return " "*(l-sl) + sif d == '=': return " "*( (l-sl)//2 ) + s + " "*( (l-sl+1)//2 )inp = input().strip()while True:if inp == "*": breakdir = inp; m = len(dir)arr = []while True:inp = input().strip()if inp[0] in "<=>*": breakarr.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 '문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon - 14897] 서로 다른 수와 쿼리 1 (0) 2023.02.21 [Baekjoon - 21016] Auction Market (0) 2023.02.15 [Baekjoon - 17017] Triangle: The Data Structure (0) 2023.02.14 [Baekjoon - 2471] 모빌 이진수 (0) 2023.02.14 [Baekjoon - 22581] IkaNumber (0) 2023.02.14