관리 메뉴

Algo μ“°μž

[Programmers]μ‹ κ·œ 아이디 μΆ”μ²œ λ³Έλ¬Έ

πŸ’― CodingTest/Programmers

[Programmers]μ‹ κ·œ 아이디 μΆ”μ²œ

S.Honey 2022. 4. 5. 17:12

μ‹ κ·œ 아이디 μΆ”μ²œ

μ‹ κ·œ 아이디 μΆ”μ²œ


문제

μΉ΄μΉ΄μ˜€μ— μž…μ‚¬ν•œ μ‹ μž… 개발자 λ„€μ˜€λŠ” "μΉ΄μΉ΄μ˜€κ³„μ •κ°œλ°œνŒ€"에 λ°°μΉ˜λ˜μ–΄, 카카였 μ„œλΉ„μŠ€μ— κ°€μž…ν•˜λŠ” μœ μ €λ“€μ˜ 아이디λ₯Ό μƒμ„±ν•˜λŠ” 업무λ₯Ό λ‹΄λ‹Ήν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. "λ„€μ˜€"μ—κ²Œ 주어진 첫 μ—…λ¬΄λŠ” μƒˆλ‘œ κ°€μž…ν•˜λŠ” μœ μ €λ“€μ΄ 카카였 아이디 κ·œμΉ™μ— λ§žμ§€ μ•ŠλŠ” 아이디λ₯Ό μž…λ ₯ν–ˆμ„ λ•Œ, μž…λ ₯된 아이디와 μœ μ‚¬ν•˜λ©΄μ„œ κ·œμΉ™μ— λ§žλŠ” 아이디λ₯Ό μΆ”μ²œν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
λ‹€μŒμ€ 카카였 μ•„μ΄λ””μ˜ κ·œμΉ™μž…λ‹ˆλ‹€.

μ•„μ΄λ””μ˜ κΈΈμ΄λŠ” 3자 이상 15자 μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
μ•„μ΄λ””λŠ” μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, λΉΌκΈ°(-), 밑쀄(_), λ§ˆμΉ¨ν‘œ(.) 문자만 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
단, λ§ˆμΉ¨ν‘œ(.)λŠ” 처음과 끝에 μ‚¬μš©ν•  수 μ—†μœΌλ©° λ˜ν•œ μ—°μ†μœΌλ‘œ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
"λ„€μ˜€"λŠ” λ‹€μŒκ³Ό 같이 7λ‹¨κ³„μ˜ 순차적인 처리 과정을 톡해 μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ 아이디가 카카였 아이디 κ·œμΉ™μ— λ§žλŠ” 지 κ²€μ‚¬ν•˜κ³  κ·œμΉ™μ— λ§žμ§€ μ•Šμ€ 경우 κ·œμΉ™μ— λ§žλŠ” μƒˆλ‘œμš΄ 아이디λ₯Ό μΆ”μ²œν•΄ μ£Όλ €κ³  ν•©λ‹ˆλ‹€.
μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ 아이디가 new_id 라고 ν•œλ‹€λ©΄,

  • 1단계 new_id의 λͺ¨λ“  λŒ€λ¬Έμžλ₯Ό λŒ€μ‘λ˜λŠ” μ†Œλ¬Έμžλ‘œ μΉ˜ν™˜ν•©λ‹ˆλ‹€.
  • 2단계 new_idμ—μ„œ μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, λΉΌκΈ°(-), 밑쀄(_), λ§ˆμΉ¨ν‘œ(.)λ₯Ό μ œμ™Έν•œ λͺ¨λ“  문자λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
  • 3단계 new_idμ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ 2번 이상 μ—°μ†λœ 뢀뢄을 ν•˜λ‚˜μ˜ λ§ˆμΉ¨ν‘œ(.)둜 μΉ˜ν™˜ν•©λ‹ˆλ‹€.
  • 4단계 new_idμ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ μ²˜μŒμ΄λ‚˜ 끝에 μœ„μΉ˜ν•œλ‹€λ©΄ μ œκ±°ν•©λ‹ˆλ‹€.
  • 5단계 new_idκ°€ 빈 λ¬Έμžμ—΄μ΄λΌλ©΄, new_id에 "a"λ₯Ό λŒ€μž…ν•©λ‹ˆλ‹€.
  • 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ„ λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€.
    λ§Œμ•½ 제거 ν›„ λ§ˆμΉ¨ν‘œ(.)κ°€ new_id의 끝에 μœ„μΉ˜ν•œλ‹€λ©΄ 끝에 μœ„μΉ˜ν•œ λ§ˆμΉ¨ν‘œ(.) 문자λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
  • 7단계 new_id의 길이가 2자 μ΄ν•˜λΌλ©΄, new_id의 λ§ˆμ§€λ§‰ 문자λ₯Ό new_id의 길이가 3이 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•΄μ„œ 끝에 λΆ™μž…λ‹ˆλ‹€.

μ œν•œμ‚¬ν•­

new_idλŠ” 길이 1 이상 1,000 μ΄ν•˜μΈ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
new_idλŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμž, μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, 특수문자둜 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
new_id에 λ‚˜νƒ€λ‚  수 μžˆλŠ” νŠΉμˆ˜λ¬ΈμžλŠ” -_.~!@#$%^&*()=+[{]}:?,<>/ 둜 ν•œμ •λ©λ‹ˆλ‹€.


> 2021 KAKAO BLIND RECRUITMENT λ¬Έμ œμ΄λ‹€.

각 단계별 그리디 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ κ΅¬ν˜„ν•˜μ˜€λ‹€.


from collections import deque

def solution(new_id):
    answer =''
    # 1단계 : μ†Œλ¬Έμž λ³€ν™˜
    new_id = new_id.lower()

    # 2단계 : 특수문자 제거
    for c in new_id:
        if (97 <= ord(c) <= 122) or (48 <= ord(c) <= 57) or c == '-' or c == '_' or c == '.' :
            answer += c
        else : 
            continue


    # 3단계 : λ§ˆμΉ¨ν‘œ 쀄이기
    temp =''
    dq = deque()
    for c in answer:
        if c == '.':
            dq.append(c)
        else : 
            if len(dq) > 0: 
                temp += dq.pop()
                dq.clear()
            temp += c
    answer = temp  



    # 4단계 : 처음과 끝 λ§ˆμΉ¨ν‘œ 제거
    if len(answer) > 0 and answer[0] == '.' :
        answer = answer[1:]

    if len(answer) > 0 and answer[len(answer)-1] == '.':
        answer = answer[:len(answer)-1]

     # 5단계 : 빈 λ¬Έμžμ—΄μ˜ 경우 a둜 μΉ˜ν™˜   
    if answer == '':
        answer = 'a'

    # 6단계 : 길이가 16자 이상이라면 첫 15개의 문자만 μΆ”μΆœ
    if len(answer) >= 16 :
        answer = answer[0:15]

    print(answer)

    # 6-1단계: 만일 제거 ν›„ λ§ˆμΉ¨ν‘œκ°€ 끝에 μžˆλ‹€λ©΄ 제거    
    if answer[len(answer)-1] == '.':
         answer = answer[:len(answer)-1]

    print(answer)

    # 7단계 : 길이가 2자 μ΄ν•˜λΌλ©΄, 길이가 3이 λ λ•ŒκΉŒμ§€ λ§ˆμ§€λ§‰ 문자 반볡
    if len(answer) <= 2:
        addChar = answer[len(answer)-1]
        while len(answer) != 3 :
            answer += addChar

    # 주의: 리슀트 μŠ¬λΌμ΄μ‹± μ‚¬μš©μ‹œ 뒷ꡬ간 μ—΄λ¦° ꡬ간인 점 κΈ°μ–΅ν•˜κΈ°.

    return answer

  1. λ¨Όμ € 인자둜 λ“€μ–΄μ˜¨ λ¬Έμžμ—΄ 쀑 λŒ€λ¬Έμžλ₯Ό μ†Œλ¬Έμžλ‘œ λ³€ν™˜.
  2. 특수문자제거(ASCII 이용)
  3. λ§ˆμΉ¨ν‘œ 쀄이기(replaceν•¨μˆ˜λ₯Ό μ΄μš©ν•œλ‹€λŠ” 생각을 ν•˜μ§€λͺ»ν•΄μ„œ 일단 deque자료ꡬ쑰λ₯Ό μ΄μš©ν•΄ μŠ€νƒμ²˜λŸΌ μ‚¬μš©)
  4. 처음과 끝 λ§ˆμΉ¨ν‘œ 제거(arrange error 방지)
  5. 빈 λ¬Έμžμ—΄μ˜ 경우 a둜 μΉ˜ν™˜
  6. 길이가 16자 이상이라면 μ•žλΆ€λΆ„ 15개의 λ¬Έμžμ—΄ μΆ”μΆœ
    6-1. μΆ”μΆœν›„ κ°€μž₯ 끝 λ¬Έμžκ°€ λ§ˆμΉ¨ν‘œ('.')라면 제거
  7. 길이가 2κΈ€μž μ΄ν•˜λΌλ©΄, 길이가 3이 λ λ•ŒκΉŒμ§€ λ§ˆμ§€λ§‰ 문자 반볡

주의 :

리슀트 μŠ¬λΌμ΄μ‹± μ‚¬μš©μ‹œ 뒷ꡬ간이 μ—΄λ¦° ꡬ간인 점을 항상 μžŠμ§€λ§μž(이거 λ•Œλ¬Έμ— μ‹œκ°„μ΄ 였래 κ±Έλ Έλ„€μš”.)

문제좜처 : ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ https://programmers.co.kr/