티스토리 뷰

반응형
백준 10798 세로읽기 파이썬 문제풀이

🧩 파이썬 문제풀이: 세로읽기 (백준 10798)

안녕하세요! 오늘은 백준의 10798번 세로읽기 문제를 직접 풀고, 고민한 과정부터 코드 개선까지 하나하나 정리해보는 시간을 가져보겠습니다.



📌 문제 요약

칠판에 글자를 가로로 붙여 단어를 만들고, 그걸 다섯 줄로 배치합니다.
그리고 이 단어들을 세로 방향으로 차례대로 읽는 프로그램을 만들어야 합니다.

주의할 점은:
  • 각 줄의 글자 수가 서로 다를 수 있음 (1~15글자)
  • 세로로 읽을 때 해당 위치에 글자가 없으면 그냥 건너뛰기
  • 출력은 공백 없이 한 줄로 이어서


🔍 예시로 보는 이해

입력이 이렇게 들어왔다고 가정합시다:
AABCDD
afzz
09121
a8EWg6
P5h3kx
각 줄은 단어 하나이며, 줄마다 길이가 다를 수 있습니다.
이걸 세로로 읽어보면:
A a 0 a P
a f 9 8 5
B z 1 E h
C z 2 W 3
D   1 g k
D   6   x
⇒ 세로로 읽은 결과는:
Aa0aPAf985Bz1EhCz2W3D1gkD6x


✍️ 내가 처음 작성한 코드

# 입력받기
lit = []
max_len = 0
for i in range(5):
    a = input()
    lit.append(a)
    if len(a) > max_len:
        max_len = len(a)

# 세로로 읽기
for i in range(max_len):
    for j in range(5):
        if i < len(lit[j]):
            print(lit[j][i], end='')


💭 내가 고민했던 것들

🧩 고민 1: 아래는 고정, 오른쪽은 가변… 이걸 어떻게 다루지?

처음에 코드를 짤 때 가장 먼저 들었던 생각은 이거였습니다:
"아래로는 5줄이니까 range(5)로 고정하면 되는데,
오른쪽(즉, 열 방향)은 줄마다 길이가 다르니까 몇 번을 반복해야 할지 모르겠다…"
그래서 각 줄의 길이 중에서 가장 긴 것만큼 열 방향을 반복해주기로 했습니다.
max_len = 0
for i in range(5):
    if len(lit[i]) > max_len:
        max_len = len(lit[i])
이렇게 하면 오른쪽으로 몇 번 세로로 읽어야 하는지가 정해집니다.

🧩 고민 2: 혹시 줄 끝에 \n 같은 게 포함되면?

입력받은 문자열에 \n이 포함되면 세로로 출력할 때 엉뚱한 글자가 나올 수도 있겠다고 생각했습니다.
하지만 다행히도, 파이썬의 input()은 기본적으로 개행 문자(\n)를 제거한 문자열만 반환하기 때문에
이 부분은 따로 신경 쓰지 않아도 됩니다.

🔧 코드 개선: 더 간단하고 깔끔하게!

처음 작성한 코드도 잘 작동하지만, 조금 더 파이썬스럽게,
가독성 좋고 효율적으로 고쳐볼 수 있습니다.

✅ 개선된 코드

# 입력
words = [input() for _ in range(5)]

# 가장 긴 줄의 길이
max_len = max(len(word) for word in words)

# 세로 읽기 결과 저장
result = ""
for i in range(max_len):
    for j in range(5):
        if i < len(words[j]):
            result += words[j][i]

# 출력
print(result)


🔍 개선 포인트 설명

📌 1. list comprehension으로 입력받기

words = [input() for _ in range(5)]
  • for문 5번 쓰는 것보다 훨씬 짧고 직관적입니다.

📌 2. max() 함수로 최대 길이 구하기

max_len = max(len(word) for word in words)
  • 리스트 안에서 바로 len()을 계산해서 max()로 최대값을 구합니다.

📌 3. print(..., end='') 대신 문자열 누적

result += words[j][i]
  • 매번 print() 하는 것보다 문자열에 차곡차곡 더하고,
  • 마지막에 한 번만 print(result) 하면 결과를 확인하기 더 쉽습니다.


🎯 핵심 정리

항목 내용
문제 핵심 세로 방향으로 문자를 읽되, 없으면 건너뛰기
어려웠던 점 열 길이가 다르므로 오른쪽 반복 횟수는 가변적
해결 방법 가장 긴 줄의 길이를 기준으로 반복
개선 포인트 max(), 리스트 컴프리헨션, 문자열 누적 사용


이건 C++ 코드

#include <iostream>
#include <cstring>
using namespace std;



int main(void)
{
	char arr[5][15] = {0,};
	int max_str = 0;
	for (int i = 0; i < 5; i++)
	{
		cin >> arr[i];
		if (max_str < strlen(arr[i]))
			max_str = strlen(arr[i]);
	}

	
	for (int i = 0; i < max_str; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			if(arr[j][i]!=0)
				cout << arr[j][i];
			
		}
		
	}
	
	return 0;

}

✅ 결론

이 문제는 단순한 문자열 출력 문제 같지만,
비정형 2차원 배열을 어떻게 다루는지가 핵심입니다.
  • 줄마다 길이가 다른 상황
  • 없는 글자는 무시해야 하는 조건
  • 입력에서 \n이 들어오는지에 대한 고려
이런 요소들을 차근차근 고민하며 해결해본 아주 좋은 문제였습니다 😊
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함
반응형