문제 보기 · Level 1 · 2021 KAKAO BLIND RECRUITMENT · 정답률 53% · 푼 사람 47,743명 (2026-09-30 기준)1
문제
입력 아이디를 7단계 규칙으로 고쳐 추천 아이디를 만든다. 순서는 이렇다.
- 소문자로 바꾸기
- 허용 문자(소문자·숫자·
-·_·.)만 남기기 - 연속 마침표를 하나로 줄이기
- 앞뒤 마침표 지우기
- 비었으면
"a"넣기 - 16자 이상이면 15자로 자르고 끝 마침표 지우기
- 2자 이하면 마지막 글자를 반복해 3자로 늘리기
- new_id 길이 1~1,000
풀이
막히면 한 단계씩 펼친다.
필요한 개념
문자열 파싱과 정규 표현식: “이런 글자만 남긴다”, “점이 여러 개 이어지면 하나로”는 정규 표현식 re.sub 한 줄씩이다.
1단계 · 작은 예로 손으로 풀기
"..A!b..c."
- 소문자 →
"..a!b..c." - 허용 문자만 →
"..ab..c."(!삭제) - 연속 마침표 하나로 →
".ab.c." - 앞뒤 마침표 삭제 →
"ab.c" - 비어 있지 않다 → 그대로
- 4자라 자를 필요 없다
- 3자 이상 → 그대로
답은 "ab.c"다.
2단계 · 가장 단순한 방법과 그 속도
단계마다 문자열을 한 번씩 훑는다. 길이가 1,000 이하라 몇천 번이면 끝난다. 이 문제는 7단계를 순서대로 빠짐없이 옮기는 문제다.
3단계 · 핵심 아이디어
단계마다 한 줄짜리 문자열 연산으로 바꾼다.
| 단계 | 코드 |
|---|---|
| 1 | s.lower() |
| 2 | re.sub(r"[^a-z0-9\-_.]", "", s) : 괄호 안이 아닌 글자를 지운다 |
| 3 | re.sub(r"\.+", ".", s) : 점이 하나 이상 이어진 곳을 점 하나로 |
| 4 | s.strip(".") : 양 끝의 점을 지운다 |
| 5 | s = s or "a" : 빈 문자열이면 “a” |
| 6 | s[:15].rstrip(".") : 15자로 자르고 끝 점을 지운다 |
| 7 | s + s[-1] * (3 - len(s)) : 3자가 될 때까지 끝 글자를 붙인다 |
4단계에서 strip(".")이 양 끝의 점을 여러 개 지워도 괜찮다. 3단계 뒤에는 이어진 점이 없어서 끝마다 점은 많아야 하나다.
4단계 · 코드 흐름
위 표를 1단계부터 7단계까지 순서대로 적용하고 돌려준다. 순서를 바꾸면 결과가 달라진다. 예를 들어 6단계로 자른 뒤 끝에 점이 새로 드러날 수 있어서, 6단계 안에서 다시 끝 점을 지운다.
일곱 단계는 문자열을 받아 문자열을 내는 함수 일곱 개의 합성이다. 1단계와 2단계만 바꿔도 대문자가 먼저 지워져서 "AB"가 "abb" 대신 "aaa"가 된다.
5단계 · 파이썬 코드
import re
def solution(new_id):
s = new_id.lower() # 1
s = re.sub(r"[^a-z0-9\-_.]", "", s) # 2
s = re.sub(r"\.+", ".", s) # 3
s = s.strip(".") # 4
s = s or "a" # 5
s = s[:15].rstrip(".") # 6
s = s + s[-1] * (3 - len(s)) # 7
return s
[^a-z0-9\-_.]: 소문자, 숫자,-,_,.이 아닌 글자 하나. 괄호 안의-는 범위 기호로 읽힐 수 있어\-로 적는다. 괄호 안의.은 진짜 점이다.s or "a": s가 빈 문자열(거짓)이면"a", 아니면 s다.s[-1] * (3 - len(s)): 끝 글자를 모자란 개수만큼 반복한다. 3자 이상이면 0번 이하 반복이라 빈 문자열이 붙는다.- 6단계의
rstrip(".")은 16자 미만일 때도 해가 없다. 4단계에서 끝 점을 이미 지웠기 때문이다.
6단계 · 실행 추적
"z-+.^."
| 단계 | 결과 |
|---|---|
| 1 | "z-+.^." (대문자 없음) |
| 2 | "z-.." (+, ^ 삭제) |
| 3 | "z-." |
| 4 | "z-" |
| 5 | "z-" |
| 6 | "z-" |
| 7 | "z--" (끝 글자 -를 붙여 3자) |
7단계 · 복잡도와 흔한 실수
단계마다 한 번 훑으니 \(O(L)\)이다.
- 괄호 안에서
-를a-z처럼 범위로 읽히는 자리에 둔다. 끝에 두거나\-로 적는다. - 3단계를
replace("..", ".")한 번으로 하면 점 세 개가 두 개로만 줄어든다. - 6단계에서 자른 뒤 끝 점을 지우지 않는다.
-
프로그래머스 스쿨, “신규 아이디 추천” (https://school.programmers.co.kr/learn/courses/30/lessons/72410), 2026-09-30 조회. ↩