파이썬 알고리즘: 2차원 문자열 세로 읽기 문제 해결 방법 비교
문제 소개
주어진 문제는 5줄의 문자열을 입력받아 세로로 읽어 출력하는 문제입니다. 각 줄은 최소 1개, 최대 15개의 글자로 구성되어 있으며, 글자는 영어 대소문자와 숫자로 이루어져 있습니다.
1. 이중 for문을 사용한 초기 접근 방식
처음에 저는 가장 직관적인 방법인 이중 for문을 사용하여 문제를 해결했습니다.
# 5줄 입력받기
words = []
for _ in range(5):
words.append(input())
# 가장 긴 문자열의 길이 찾기
max_len = max(len(word) for word in words)
# 세로로 읽기
result = ''
for i in range(max_len): # 각 열을 순회
for j in range(len(words)): # 각 행을 순회
if i < len(words[j]):
result += words[j][i]
print(result)
이 방식의 특징:
- 직관적이고 이해하기 쉬운 코드
- 명시적인 인덱스 처리로 각 단계가 명확함
- 길이가 다른 문자열도 올바르게 처리 가능
2. zip 함수를 활용한 개선된 방식
AI와의 대화를 통해 itertools.zip_longest
를 사용한 더 파이썬스러운 해결 방법을 알게 되었습니다.
from itertools import zip_longest
words = []
for _ in range(5):
words.append(input())
result = ''
for chars in zip_longest(*words, fillvalue=''):
result += ''.join(chars)
print(result)
이 방식의 특징:
- 더 간결하고 파이썬스러운 코드
zip_longest
를 통한 우아한 길이 차이 처리- 추가적인 길이 계산이나 조건문이 필요 없음
3. 두 방식의 비교 분석
시간복잡도
두 방식 모두 시간복잡도는 O(R * C)입니다.
- R: 행의 수 (이 문제에서는 5)
- C: 가장 긴 문자열의 길이
주요 차이점
- 코드 길이와 가독성
- 이중 for문: 더 긴 코드지만 동작 방식이 명확
- zip_longest: 더 짧고 간결한 코드지만 파이썬의 내장 기능에 대한 이해 필요
- 성능상의 차이
- 이중 for문: 매 반복마다 길이 체크 필요
- zip_longest: 이터레이터 생성 오버헤드 존재
- 실제로는 이 정도 크기의 입력에서 성능 차이는 무시할 만한 수준
- 유지보수성
- 이중 for문: 로직 수정이 필요할 때 더 세밀한 제어 가능
- zip_longest: 코드가 간결하여 실수할 여지가 적음
결론
두 방식 모두 문제를 해결할 수 있는 유효한 접근 방법입니다. 초기에 사용한 이중 for문 방식은 알고리즘의 동작을 명확하게 이해하고 설명하기에 좋은 방법이었습니다. 반면 zip_longest를 사용한 방식은 파이썬의 강력한 내장 기능을 활용하여 더 간결하고 우아한 해결책을 제시합니다.
이런 문제 해결 과정은 알고리즘 학습에서 중요한 교훈을 줍니다:
- 먼저 직관적이고 명확한 방법으로 문제를 해결하기
- 언어의 특성과 내장 기능을 활용하여 코드를 개선하기
- 두 방식의 장단점을 이해하고 상황에 맞는 적절한 선택하기
이러한 과정을 통해 우리는 더 나은 프로그래머로 성장할 수 있습니다.