문제 개요
문자열 s가 주어졌을 때, s에 등장한 순서 그대로 모든 단어를 세로 방향으로 읽어야 합니다. 결과는 문자열 리스트로 반환하며, 각 행의 길이를 맞추기 위해 필요한 만큼 공백으로 채웁니다(단, 뒤쪽 공백은 허용되지 않습니다). 각 단어는 하나의 열에만 배치되고, 하나의 열에는 하나의 단어만 존재합니다.
예를 들어 입력 문자열이 "HOW ARE YOU"라면, 각 단어의 첫 번째 글자(H, A, Y), 두 번째 글자(O, R, O), 세 번째 글자(W, E, U)를 차례로 읽어 출력은 ["HAY", "ORO", "WEU"]가 됩니다.
해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- s를 공백을 기준으로 분리해 문자열 리스트로 만들고, 빈 배열 x를 준비한 뒤 row를 0으로 초기화합니다.
- s의 각 단어 i에 대해 row를 max(row, len(i))로 갱신합니다. 즉, 가장 긴 단어의 길이가 곧 행(row)의 개수가 됩니다.
- col은 s의 길이, 즉 단어의 개수로 설정합니다.
- 빈 문자열로 채워진 크기 row짜리 배열 ans를 생성합니다.
- i를 0부터 col-1까지 반복하면서 다음을 수행합니다.
- j를 0으로 초기화합니다.
- j가 s[i]의 길이보다 작은 동안:
- i - len(ans[j]) >= 1인 동안 ans[j]에 공백을 이어 붙여 자릿수를 맞춥니다.
- ans[j]에 s[i][j]를 추가합니다.
- j를 1 증가시킵니다.
- 모든 반복이 끝나면 ans를 반환합니다.
파이썬 구현 예제
아래 구현을 통해 동작 과정을 더 명확히 이해할 수 있습니다.
class Solution(object):
def printVertically(self, s):
s = s.split(" ")
x = []
row = 0
for i in s:
row = max(row, len(i))
col = len(s)
ans = ["" for i in range(row)]
j = 0
for i in range(col):
j = 0
while j < len(s[i]):
#print(j, i)
while i - len(ans[j]) >= 1:
ans[j] += " "
ans[j] += s[i][j]
j += 1
return ans
ob = Solution()
print(ob.printVertically("HOW ARE YOU"))
print(ob.printVertically("TO BE OR NOT TO BE"))
입력
"HOW ARE YOU" "TO BE OR NOT TO BE"
출력
["HAY","ORO","WEU"] ["TBONTB","OEROOE"," T"]
정리
핵심 아이디어는 가장 긴 단어의 길이만큼 행을 만들고, 각 단어를 왼쪽부터 한 글자씩 해당 행에 붙이되, 앞선 단어들이 아직 그 위치까지 도달하지 못했다면 공백으로 간격을 채우는 것입니다. 이렇게 하면 원본 문자열의 단어 순서를 그대로 유지한 세로 방향 텍스트를 얻을 수 있습니다.