프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문자열의 각 알파벳을 정해진 거리 $n$만큼 밀어서 새로운 문자로 변환하는 암호화 로직을 구현하는 문제입니다. 아스키 코드의 수치 변환과 알파벳의 순환 구조를 처리하는 것이 핵심입니다.
1. 나의 풀이
def solution(s, n):
# 결과 값을 담을 리스트 초기화 (문자열 수정 불가 특성 고려)
answer = [' '] * len(s)
for i in range(len(s)):
# 공백은 변환 없이 그대로 유지
if s[i] == ' ':
continue
# 대소문자에 따른 기준 아스키 코드 설정
base = ord('A') if s[i].isupper() else ord('a')
# 알파벳 순환 계산: (현재값 - 기준값 + 이동거리) % 26 + 기준값
answer[i] = chr((ord(s[i]) - base + n) % 26 + base)
return ''.join(answer)
2. 오늘 배운 점 및 복기 노트
아스키 코드 변환 함수 ord()와 chr()의 활용
문자를 컴퓨터가 이해하는 정수값으로 바꿀 때는 ord(), 다시 문자로 되돌릴 때는 chr()를 사용합니다. 대문자 'A'는 65, 소문자 'a'는 97부터 시작한다는 점을 인지하고 있으면 로직 설계 시 유용합니다.
조건문을 활용한 초기 접근 방식의 한계
처음 문제를 풀 때는 아래와 같이 알파벳의 범위를 직접 계산하여 초과 시 값을 빼주는 방식을 사용했습니다.
# 처음 시도한 코드
def solution(s, n):
answer = ['a'] * len(s)
for i in range(len(s)):
if s[i] == ' ':
answer[i] = ' '
elif ord(s[i]) in range(ord('A'), (ord('Z') + 1)):
new_ord = ord(s[i]) + n
if new_ord > ord('Z'):
answer[i] = chr(new_ord - ord('Z') + ord('A') - 1)
else:
answer[i] = chr(new_ord)
elif ord(s[i]) in range(ord('a'), (ord('z') + 1)):
new_ord = ord(s[i]) + n
if new_ord > ord('z'):
answer[i] = chr(new_ord - ord('z') + ord('a') - 1)
else:
answer[i] = chr(new_ord)
return ''.join(answer)
위 코드는 $n$이 알파벳 개수인 26보다 작은 경우, 즉 이번 문제에서는 정상 작동합니다. 하지만 $n$의 범위가 매우 커질 경우 단순 뺄셈으로는 순환 구조를 처리하기 어렵다는 한계가 있습니다.
나머지 연산자(%)를 통한 순환 구조 정규화
알파벳은 26개를 주기로 반복됩니다. 특정 기준점(base)을 0으로 만든 뒤 $n$을 더하고 26으로 나눈 나머지를 구하면, $n$이 아무리 크더라도 항상 0~25 사이의 인덱스로 안착시킬 수 있습니다. 이는 원형 큐나 시계 방향 회전 로직에서도 동일하게 적용되는 테크닉입니다.
3. 프로그래머스 코딩 테스트 문제 풀이 전략 교재에서 배울만한 점
데이터 정규화와 오프셋(Offset) 활용
교재에서는 (현재 문자 - 시작 문자 + n) % 26 공식을 제시합니다. 이는 'A'나 'a'를 0번 인덱스로 간주하는 일종의 좌표 평면 이동과 같습니다. 복잡한 if-else 분기 처리를 수학적 수식 한 줄로 대체하여 코드의 가독성과 유지보수성을 크게 높일 수 있습니다.
문자열 조작 시 리스트 사용의 효율성
파이썬의 문자열은 불변(Immutable) 객체입니다. 따라서 문자열에 + 연산을 반복하면 매번 새로운 객체가 생성되어 메모리 효율이 떨어집니다. 수정이 잦은 작업에서는 리스트에 값을 담은 뒤 마지막에 ''.join()으로 합치는 것이 성능 최적화에 좋습니다.
'알고리즘 > 프로그래머스 문제 풀이 전략' 카테고리의 다른 글
| 문제8 - 튜플 (Python) (0) | 2026.04.23 |
|---|---|
| 문제7 - 이상한 문자 만들기 (Python) (0) | 2026.04.22 |
| 문제5 - 행렬의 곱셈 (Python) (0) | 2026.04.21 |
| 문제4 - 거리두기 확인하기 (Python) (0) | 2026.04.21 |
| 문제3 - 삼각 달팽이 (Python) (0) | 2026.04.21 |
