본문 바로가기

알고리즘 삽질장

[프로그래머스] 신규 아이디 추천

반응형


문제설명

https://programmers.co.kr/learn/courses/30/lessons/72410

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

사고과정

  • 하.. 카카오 블라인드 문제는 레벨 1도 매우 까다롭다..증말.. 시간을 재서 풀지는 않았는데 오래걸리더라도 기어코 풀어냈다..
  • 1단계는 매우 쉽게 lower() 로 구현하면 된다
  • 2단계는 replace 함수가 기본적으로 inplace가 안되기 때문에 무조건 새로운 변수 또는 기존 변수에 재할당시켜주어야 한다.. 이것때문에 또 시간 걸림..
  • 3단계가 시간이 가장 많이걸렸는데.. 연속적인 2개이상  . 마침표가 나오게 되면 한개의 마침표(.)로 치환해주어야 했다. 예전에 풀어본 괄호문제 유형이랑 비슷한 것 같아서 처음에 스택으로 구현하자고 머리를 쥐어싸매면서 while 문? for 문? 에서 매우 갈등했다. 그러다가 스택에 문자열을 하나씩 for loop로 넣으면서 마침표가 등장할 때는 스택에 마침표가 있는지 없는지 확인하면서 구현에 성공했다!
  • 4단계, 5단계는 한번에 수행했다. 단, 만약 new_id가 . 마침표 1개만 존재할 때 문자열을 담은 리스트가 비어버리기 때문에 그 사이에 문자열 담은 리스트가 비어잇는지 확인하는 조건을 사이에 무조건 추가해야 한다. 안그러면 그 뒤의 조건인 인덱스 -1을 참조하라는 것에서 out of range index 에러가 발생한다.
  • 6단계는 비교적 쉬웠다. 그런데 문제를 또 대충읽었는지.. 6단계에서 15개 문자열 짜르고 마지막에 . 마침표 붙어있으면 제거하라는 걸 처음에 못봤다..
  • 7단계는 while 문을 사용해서 잘 구현!

풀이

def solution(new_id):
    # 1단계 - 모두 소문자로 치환
    new_id = new_id.lower()
    # 2단계 - 소문자, 특정 문자 아닌 것들 제거
    mark = ['-', '_', '.']
    for x in new_id:
        if x.isalnum():
            continue
        if x not in mark:
            new_id = new_id.replace(x, '')
    # 3단계
    stack = []
    for x in new_id:
        if x.isalnum() or x in mark[:-1]:
            stack.append(x)
        elif x == '.':
            if not stack:
                stack.append(x)
            elif stack[-1] == '.':
                continue
            else:
                stack.append(x)
    new_id = stack
    # 4단계, 5단계
    answer = new_id

    if answer[0] == '.':
        answer = answer[1:]
    if not answer:
        answer.append('a')
    elif answer[-1] == '.':
        answer = answer[:-1]
    # 6단계
    if len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]
    # 7단계
    while len(answer) <= 2:
        answer.append(answer[-1])
    return ''.join(answer)
반응형