• Home
  • About
    • Eyedicamp 개발 이야기 photo

      Eyedicamp 개발 이야기

      Big Data, Machine Learning, AI 등의 다양한 이야기를 하는 곳.

    • Learn More
    • Email
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[BOJ 10798] 세로읽기

05 Feb 2026

Reading time ~4 minutes

문제 요약

문자열 5개(각 1~15자)가 주어진다.
왼쪽에서 오른쪽으로 열(column) 단위로 이동하면서, 같은 위치의 글자를 위에서 아래로 읽되 해당 위치에 글자가 없으면 건너뛴다.
읽은 글자들을 공백 없이 이어서 출력한다.


내가 작성한 코드 (정답)

import sys

input = sys.stdin.readline

letters = []
result = ''
max_length = 0

for _ in range(5):
    letter = input().strip()
    letters.append(letter)

for letter in letters:
    if len(letter) > max_length:
        max_length = len(letter)

for index in range(len(letters)):
    if len(letters[index]) < max_length:
        letters[index] += ' ' * (max_length - len(letters[index]))

for i in range(max_length):
    for j in range(5):
        result += letters[j][i]

result = result.replace(' ', '')

print(result)

이번 문제로 배운 점 (내가 체감한 포인트)

1) for letter in letters:에서 letter += ... 해도 리스트가 안 바뀐다

문자열은 불변(immutable)이고, for letter in letters:의 letter는 리스트 원소를 가리키는 지역 변수라서, letter += ' '를 해도 리스트의 원소 자체를 갱신하지 않는다.

리스트를 실제로 바꾸려면, 아래처럼 인덱스로 다시 대입해야 한다.

for idx in range(len(letters)):
    letters[idx] += "..."

2) replace()로 특정 문자를 한 번에 제거할 수 있다

공백 패딩을 한 뒤, 마지막에

result = result.replace(' ', '')

처럼 처리하면 내부 공백을 쉽게 제거할 수 있다.


개선 포인트

위 코드는 정답이지만, 아래를 더 깔끔하게 만들 수 있다.

  1. result += ...로 문자열을 계속 더하면(누적) 파이썬에서는 비효율적일 수 있다.
    → 리스트에 모아두고 ''.join(...)으로 합치는 방식이 정석이다.

  2. 애초에 공백으로 패딩했다가 replace(' ', '')로 지우지 말고,
    해당 인덱스가 문자열 길이 안에 있을 때만 추가하면 로직이 더 직관적이다.

  3. (선택) itertools.zip_longest를 쓰면 “열 기준 순회”를 깔끔하게 표현할 수 있다.


최종 코드 1 (추천): 조건으로 건너뛰기 + join

import sys
input = sys.stdin.readline

words = [input().strip() for _ in range(5)]
max_len = max(map(len, words))

out = []
for c in range(max_len):
    for r in range(5):
        if c < len(words[r]):
            out.append(words[r][c])

print(''.join(out))

이 코드에서 배울 수 있는 점

  • max_len = max(map(len, words)) 처럼 길이의 최댓값을 한 줄로 구할 수 있다.
  • 문자열 누적은 out.append(...)로 모은 뒤 ''.join(out)이 안전하고 깔끔하다.
  • “없으면 건너뛴다”는 문제 조건이 if c < len(words[r])로 바로 드러난다.

최종 코드 2 (대안): zip_longest로 더 파이써닉하게

import sys
from itertools import zip_longest

input = sys.stdin.readline

words = [input().strip() for _ in range(5)]

# 각 열을 튜플로 묶고, 없는 칸은 ''로 채운 뒤, 그대로 이어붙이기
print(''.join(ch for col in zip_longest(*words, fillvalue='') for ch in col))

이 코드에서 배울 수 있는 점

  • zip_longest(*words)는 “행(row) 5개를 열(column) 단위로” 묶어서 순회할 수 있게 해준다.
  • fillvalue=''로 “없는 글자는 빈 문자열” 처리 → 자연스럽게 건너뛰는 효과가 난다.
  • 중첩 루프를 한 줄로 표현할 수 있지만, 익숙하지 않으면 1번 코드가 더 읽기 쉽다.



pythonstringlistjoinitertools Share Tweet +1