문제 보기 · Level 1 · 2021 KAKAO BLIND RECRUITMENT · 정답률 53% · 푼 사람 47,743명 (2026-09-30 기준)1

문제

입력 아이디를 7단계 규칙으로 고쳐 추천 아이디를 만든다. 순서는 이렇다.

  1. 소문자로 바꾸기
  2. 허용 문자(소문자·숫자·-·_·.)만 남기기
  3. 연속 마침표를 하나로 줄이기
  4. 앞뒤 마침표 지우기
  5. 비었으면 "a" 넣기
  6. 16자 이상이면 15자로 자르고 끝 마침표 지우기
  7. 2자 이하면 마지막 글자를 반복해 3자로 늘리기
  • new_id 길이 1~1,000

풀이

막히면 한 단계씩 펼친다.

필요한 개념

문자열 파싱과 정규 표현식: “이런 글자만 남긴다”, “점이 여러 개 이어지면 하나로”는 정규 표현식 re.sub 한 줄씩이다.

1단계 · 작은 예로 손으로 풀기

"..A!b..c."

  1. 소문자 → "..a!b..c."
  2. 허용 문자만 → "..ab..c." (! 삭제)
  3. 연속 마침표 하나로 → ".ab.c."
  4. 앞뒤 마침표 삭제 → "ab.c"
  5. 비어 있지 않다 → 그대로
  6. 4자라 자를 필요 없다
  7. 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단계에서 자른 뒤 끝 점을 지우지 않는다.
검증: 문제의 예시 5개를 통과했고, 무작위 문자열 3,000개에서 규칙을 글자 단위로 그대로 따라가는(정규 표현식 없는) 다른 풀이와 결과가 같았다 — 06_pg72410_p1.py
  1. 프로그래머스 스쿨, “신규 아이디 추천” (https://school.programmers.co.kr/learn/courses/30/lessons/72410), 2026-09-30 조회. ↩