프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
카카오 서비스에 가입하는 유저들의 아이디가 규칙에 맞지 않을 때, 7단계의 순차적인 처리 과정을 거쳐 추천 아이디를 생성하는 문제입니다. 문자열 필터링, 특정 패턴의 치환, 길이 제한 및 예외 상황 처리가 주요 핵심입니다.
1. 나의 풀이
def solution(new_id):
# 1단계: 소문자로 변환
lower_id = list(new_id.lower())
new_id = []
# 2단계 & 3단계: 허용된 문자 필터링 및 연속 마침표 처리
for char in lower_id:
# 알파벳, 숫자, -, _, . 이 아니면 제외
if not (char.isdigit() or char.isalpha() or char in "-_."):
continue
# 이전 문자가 마침표이고 현재 문자도 마침표인 경우(연속)를 방지하며 리스트에 추가
if (not new_id) or (not (new_id[-1] == '.' and char == '.')):
new_id.append(char)
# 4단계: 양 끝 마침표 제거 (뒤쪽 먼저 처리)
if new_id and new_id[-1] == '.':
new_id = new_id[:-1]
if new_id and new_id[0] == '.':
new_id = new_id[1:]
# 5단계: 빈 문자열 처리
if not new_id:
new_id.append('a')
# 6단계: 길이 제한 처리 및 끝 마침표 재검사
new_id = new_id[:15]
if new_id and new_id[-1] == '.':
new_id = new_id[:-1]
# 7단계: 길이 3 미만인 경우 마지막 문자 반복
while len(new_id) <= 2:
new_id.append(new_id[-1])
return ''.join(new_id)
2. 오늘 배운 점 및 복기 노트
원패스(One-pass) 필터링 로직의 효율성
2단계(문자 제거)와 3단계(연속 마침표 치환)를 각각 수행하지 않고, 하나의 반복문 안에서 해결했습니다. 새로운 리스트에 문자를 하나씩 담을 때 new_id[-1]을 확인하여 현재 문자가 마침표이고 직전 문자도 마침표라면 append를 건너뛰는 방식은 연산 횟수를 줄이는 효율적인 접근입니다.
방어적 코딩의 중요성
리스트의 마지막 요소에 접근할 때(new_id[-1])나 슬라이싱을 진행할 때, 항상 if new_id: 조건을 통해 리스트가 비어 있지 않은지 먼저 확인했습니다. 이는 인덱스 에러(IndexError)를 방지하는 필수적인 습관입니다.
문자열 수정 시 리스트 활용
파이썬의 문자열은 불변 객체이므로 수정이 잦을 경우 리스트에 담아 append하고 마지막에 ''.join()으로 합치는 것이 성능 최적화 면에서 유리함을 확인했습니다.
3. 프로그래머스 코딩 테스트 문제 풀이 전략 교재에서 배울만한 점
내장 함수를 활용한 가독성 확보 교재에서는 양 끝의 문자를 제거할 때 strip('.') 함수를 사용했습니다. 직접 인덱스를 슬라이싱하는 방식보다 함수 하나로 처리하는 것이 "양 끝의 마침표를 제거한다"는 코드의 의도를 훨씬 더 명확하게 전달할 수 있습니다.
# 교재 스타일의 4단계 처리
answer = answer.strip('.')
복잡한 치환 로직의 단순화
연속된 마침표를 처리할 때 while '..' in answer: 조건과 replace('..', '.')를 활용하는 기법을 제시했습니다. 알고리즘적으로는 반복 횟수가 많아질 수 있으나, 정규표현식을 쓰지 않는 상황에서 코드를 가장 직관적으로 읽히게 만드는 방법입니다.
단계별 독립성 유지
교재는 7단계를 섞지 않고 각 단계가 완전히 독립적으로 동작하도록 코드를 구성했습니다. 이는 복잡한 구현 문제에서 로직이 꼬이는 것을 방지하고, 특정 단계의 요구사항이 변경되었을 때 해당 부분만 빠르게 수정할 수 있는 유지보수성을 제공합니다.
문자열 더하기 연산을 사용할 경우
파이썬에서 문자열을 +로 합치는 것은 비용이 높다고 알려져 있으나, 7단계와 같이 반복 횟수가 매우 적은(최대 2회) 경우에는 가독성을 위해 answer += answer[-1]과 같은 방식을 사용해도 성능에 큰 무리가 없습니다.
'알고리즘 > 프로그래머스 문제 풀이 전략' 카테고리의 다른 글
| 문제12 - 이진 변환 반복하기 (Python) (0) | 2026.04.26 |
|---|---|
| 문제11 - 3진법 뒤집기 (Python) (0) | 2026.04.26 |
| 문제10 - 문자열 압축 (Python) (0) | 2026.04.24 |
| 문제9 - 짝지어 제거하기 (Python) (0) | 2026.04.23 |
| 문제8 - 튜플 (Python) (0) | 2026.04.23 |
