티스토리 뷰
반응형
🧩 파이썬 문제풀이: 세로읽기 (백준 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)
하면 결과를 확인하기 더 쉽습니다.
🎯 핵심 정리
이건 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
이 들어오는지에 대한 고려
반응형
'백준 스터디' 카테고리의 다른 글
색종이 넓이 계산 백준 2563, C++ (0) | 2025.06.01 |
---|---|
🧩 백준 1018번 - 체스판 다시 칠하기. 파이썬 (0) | 2025.05.30 |
백준 1018 체스판 다시 칠하기 C++ (1) | 2025.05.30 |
백준 2798 블랙잭 파이썬, C++ (0) | 2025.05.29 |
백준 11653 소인수분해 파이썬 풀이 (0) | 2025.05.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코딩테스트
- 알고리즘기초
- 코딩
- c++알고리즘
- 문자열처리
- 브루트포스
- 인접 행렬
- 파이썬
- 객체지향
- 그래프 탐색
- 문제 풀이
- 동적 계획법
- c언어
- 프로그래밍
- 동적계획법
- Python
- 알고리즘문제풀이
- python 알고리즘
- 그리디알고리즘
- DP
- 알고리즘
- 문제풀이
- 코딩 테스트
- C++ 알고리즘
- 파이썬코딩
- C++
- 그리디
- 알고리즘 문제풀이
- 백준
- dfs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형