HanSol's Oak Cask

백준 9093번: 단어 뒤집기 (Python) 본문

알고리즘, 코딩테스트

백준 9093번: 단어 뒤집기 (Python)

HanSol_Lim 2025. 2. 18. 10:10

🔍 내 코드 vs 개선 코드 vs 스택을 이용한 코드 비교


1️⃣ 내 코드

import sys
t = int(sys.stdin.readline())

for _ in range(t):
    words = sys.stdin.readline().split()
    for i in words:
        print(i[::-1], end=" ")
    print("")

✅ 특징

✔ sys.stdin.readline().split() → 문장을 단어별로 분리
슬라이싱 ([::-1]) 사용 → 단어를 뒤집음
✔ print(i[::-1], end=" ") → 단어 뒤집어서 출력
✔ print("") → 줄바꿈

🚀 시간 복잡도 분석

  • split() → O(N)
  • 슬라이싱 [::-1] → O(M) (M: 단어 길이, 최대 20)
  • 총 시간 복잡도O(NM) ≈ O(N)

2️⃣ 개선 코드 (더 간결한 코드)

import sys

t = int(sys.stdin.readline())

for _ in range(t):
    print(" ".join(word[::-1] for word in sys.stdin.readline().split()))

✅ 특징

리스트 컴프리헨션 사용 → 더 짧고 가독성이 좋음
" ".join(...) 사용 → 단어를 공백 기준으로 출력
print() 한 번만 호출 → 실행 속도 최적화

🚀 시간 복잡도 분석

  • split() → O(N)
  • 슬라이싱 [::-1] (리스트 컴프리헨션) → O(M)
  • " ".join() → O(N) (모든 단어를 다시 합치는 연산)
  • 총 시간 복잡도O(N) (최적화된 구조)

🔥 기존 코드 대비 개선점

코드가 짧아짐 (더 간결한 표현)
출력 방식 최적화 (print() 여러 번 호출 대신 한 번 호출)
가독성이 향상됨


3️⃣ 스택을 이용한 코드

import sys

t = int(sys.stdin.readline())

for _ in range(t):
    words = sys.stdin.readline().split()
    for word in words:
        stack = list(word)  # 각 단어를 문자 리스트로 변환
        reversed_word = ""  # 뒤집힌 단어를 저장할 변수

        while stack:  # 스택이 빌 때까지 pop 수행
            reversed_word += stack.pop()

        print(reversed_word, end=" ")
    print()

✅ 특징

스택을 이용하여 단어를 뒤집음 (pop() 사용)
단어를 문자 단위로 리스트에 저장 후 하나씩 제거하면서 뒤집음
슬라이싱을 사용하지 않음 (Python의 기본 기능만 활용)

🚀 시간 복잡도 분석

  • split() → O(N)
  • 스택을 이용한 뒤집기 (pop()) → O(M) (M: 단어 길이)
  • 총 시간 복잡도O(NM) ≈ O(N)

⚠ 단점

  1. 슬라이싱([::-1])보다 속도가 느림 (Python에서 [::-1]이 내부적으로 더 최적화되어 있음)
  2. 코드가 더 길어짐 (불필요한 변수가 추가됨)
  3. 별도의 스택을 만들 필요 없이, 슬라이싱이 더 적절한 방법임

📌 3가지 방법 비교

방법 코드 길이 시간 복잡도 장점 단점

기존 코드 보통 (4줄) O(N) 직관적이고 이해하기 쉬움 print()를 여러 번 호출 (비효율적)
개선 코드 가장 짧음 (1줄) O(N) 가장 간결하고 실행 속도가 빠름 Python 문법을 잘 모르면 이해하기 어려울 수 있음
스택 코드 가장 김 (6줄) O(N) 자료구조 개념을 연습하기 좋음 성능이 떨어지고 코드가 길어짐

🎯 결론

  1. 가장 빠르고 간결한 코드: ✅ 개선 코드 (" ".join(...) 활용)
    • Python의 문자열 슬라이싱([::-1])과 " ".join()을 사용해 최적화된 성능을 보임.
    • 실제 코딩 테스트에서 추천되는 방법.
  2. 스택 사용은 비효율적: ❌ 스택 기반 풀이
    • 문제에서 스택을 사용할 필요가 없음.
    • Python의 슬라이싱([::-1])이 내부적으로 더 빠름.

📌 결론적으로, 개선 코드 (" ".join(word[::-1] for word in sys.stdin.readline().split()))가 가장 효율적이며 최선의 방법 🚀🔥