Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- useRef
- 파이썬
- 코딩테스트
- Live Template
- xapi
- Runwith
- 연계방식
- JUnit5
- diary
- extendwith
- 부하 테스트
- 테스트
- 데이터 거버넌스
- 데이터 직렬화
- JUnit
- 일기
- 소스코드품질
- 영어일기
- 스택
- git
- 백준
- LRS
- playgroundAI
- 알고리즘
- AI그림
- 정적분석도구
- serializtion
- application.yml
- git 오류
- notempty
Archives
- Today
- Total
HanSol's Oak Cask
백준 9093번: 단어 뒤집기 (Python) 본문
🔍 내 코드 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])보다 속도가 느림 (Python에서 [::-1]이 내부적으로 더 최적화되어 있음)
- 코드가 더 길어짐 (불필요한 변수가 추가됨)
- 별도의 스택을 만들 필요 없이, 슬라이싱이 더 적절한 방법임
📌 3가지 방법 비교
방법 코드 길이 시간 복잡도 장점 단점
| 기존 코드 | 보통 (4줄) | O(N) | 직관적이고 이해하기 쉬움 | print()를 여러 번 호출 (비효율적) |
| 개선 코드 | 가장 짧음 (1줄) | O(N) | 가장 간결하고 실행 속도가 빠름 | Python 문법을 잘 모르면 이해하기 어려울 수 있음 |
| 스택 코드 | 가장 김 (6줄) | O(N) | 자료구조 개념을 연습하기 좋음 | 성능이 떨어지고 코드가 길어짐 |
🎯 결론
- 가장 빠르고 간결한 코드: ✅ 개선 코드 (" ".join(...) 활용)
- Python의 문자열 슬라이싱([::-1])과 " ".join()을 사용해 최적화된 성능을 보임.
- 실제 코딩 테스트에서 추천되는 방법.
- 스택 사용은 비효율적: ❌ 스택 기반 풀이
- 문제에서 스택을 사용할 필요가 없음.
- Python의 슬라이싱([::-1])이 내부적으로 더 빠름.
📌 결론적으로, 개선 코드 (" ".join(word[::-1] for word in sys.stdin.readline().split()))가 가장 효율적이며 최선의 방법 🚀🔥
'알고리즘, 코딩테스트' 카테고리의 다른 글
| 백준 1874번: 스택 수열 (Python) (0) | 2025.02.19 |
|---|---|
| 백준 9012번: 괄호 (Python) (1) | 2025.02.18 |
| 백준 10828번: 스택 (Python) (0) | 2025.02.18 |
| 백준 2839번: 설탕 배달 문제 해결 과정 (Python) (0) | 2025.02.14 |
| 특정 요소가 다른 모든 요소의 합보다 큰 지 판별하는 방법 (0) | 2025.02.12 |