λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ¦„ | μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€_Lv1_μ‹ κ·œ 아이디 μΆ”μ²œ

by KASSID 2021. 12. 22.

λͺ©μ°¨

    728x90

    문제 μ„€λͺ…

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

    • μ•„μ΄λ””μ˜ κΈΈμ΄λŠ” 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 값이 "...!@BaT#*..y.abcdefghijklm" 라면, μœ„ 7단계λ₯Ό 거치고 λ‚˜λ©΄ new_idλŠ” μ•„λž˜μ™€ 같이 λ³€κ²½λ©λ‹ˆλ‹€.

    1단계 λŒ€λ¬Έμž 'B'와 'T'κ°€ μ†Œλ¬Έμž 'b'와 't'둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.
    "...!@BaT#*..y.abcdefghijklm"  "...!@bat#*..y.abcdefghijklm"

    2단계 '!', '@', '#', '*' λ¬Έμžκ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    "...!@bat#*..y.abcdefghijklm"  "...bat..y.abcdefghijklm"

    3단계 '...'와 '..' κ°€ '.'둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.
    "...bat..y.abcdefghijklm"  ".bat.y.abcdefghijklm"

    4단계 μ•„μ΄λ””μ˜ μ²˜μŒμ— μœ„μΉ˜ν•œ '.'κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    ".bat.y.abcdefghijklm"  "bat.y.abcdefghijklm"

    5단계 아이디가 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹ˆλ―€λ‘œ λ³€ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
    "bat.y.abcdefghijklm"  "bat.y.abcdefghijklm"

    6단계 μ•„μ΄λ””μ˜ 길이가 16자 μ΄μƒμ΄λ―€λ‘œ, 처음 15자λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ΄ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    "bat.y.abcdefghijklm"  "bat.y.abcdefghi"

    7단계 μ•„μ΄λ””μ˜ 길이가 2자 μ΄ν•˜κ°€ μ•„λ‹ˆλ―€λ‘œ λ³€ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
    "bat.y.abcdefghi"  "bat.y.abcdefghi"

    λ”°λΌμ„œ μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ new_idκ°€ "...!@BaT#*..y.abcdefghijklm"일 λ•Œ, λ„€μ˜€μ˜ ν”„λ‘œκ·Έλž¨μ΄ μΆ”μ²œν•˜λŠ” μƒˆλ‘œμš΄ μ•„μ΄λ””λŠ” "bat.y.abcdefghi" μž…λ‹ˆλ‹€.


    [문제]

    μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ 아이디λ₯Ό λ‚˜νƒ€λ‚΄λŠ” new_idκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, "λ„€μ˜€"κ°€ μ„€κ³„ν•œ 7λ‹¨κ³„μ˜ 처리 과정을 거친 ν›„μ˜ μΆ”μ²œ 아이디λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

    [μ œν•œμ‚¬ν•­]

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


    [μž…μΆœλ ₯ 예]nonew_idresult
    예1 "...!@BaT#*..y.abcdefghijklm" "bat.y.abcdefghi"
    예2 "z-+.^." "z--"
    예3 "=.=" "aaa"
    예4 "123_.def" "123_.def"
    예5 "abcdefghijklmn.p" "abcdefghijklmn"

    λ‚˜μ˜ μ½”λ“œ

    def solution(new_id):
        new_id = new_id.lower() #1
        answer = ''
        allow = [ord('.'),ord('-'),ord('_')]
        for i in range(len(new_id)): #2
            if new_id[i].isdigit() or ord('a') <= ord(new_id[i]) <= ord('z') or ord(new_id[i]) in allow:
                answer+=new_id[i]
    
    
        while('..' in answer): #3
            answer = answer.replace('..','.')
    
        if answer[0] == '.':
            if answer == '.' : return 'aaa'
            answer = answer[1:] #4
        if answer[-1] == '.': answer = answer[0:-1]
    
        if len(answer) == 0: return 'aaa' #5
    
        if len(answer) >= 16: #6
            answer=answer[:15]
            if answer[-1] == '.':
                answer = answer[:-1]
        elif len(answer) <= 2: #7
            while len(answer)<3:
                answer+=answer[-1]
        return answer

    μ½”λ©˜νŠΈ)

    일단 μ½”λ“œλ₯Ό 완성을 ν•΄μ„œ 결과도 잘 λ‚˜μ™”μ§€λ§Œ λ‹€μ‹œ λ³΄λ‹ˆ μ•„μ‰¬μš΄ 점이 λ³΄μ˜€λ‹€.

     

    1. μ‘°κ±΄μ—μ„œ ꡳ이 μ•„μŠ€ν‚€μ½”λ“œ 숫자둜 바꾸지 μ•Šκ³  λŒ€μ†Œλ₯Ό λΉ„κ΅ν•˜μ—¬λ„ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€!

    2. μ€‘κ΅¬λ‚œλ°© μž‘μ„±ν•˜μ§€ μ•Šκ³  단계λ₯Ό λ”°λΌμ„œ μ§œλŠ” 것이 더 직관적이닀!

    3. 7단계 whileλ¬Έ μžμ²΄κ°€ 쑰건이 λ“€μ–΄κ°€ μžˆμœΌλ―€λ‘œ if문은 쓸데 μ—†λŠ” λΆ€λΆ„μ΄μ—ˆλ‹€!

     

    라고 생각을 ν•˜μ˜€κΈ°μ— μˆ˜μ •μ„ ν•΄λ³΄μ•˜λ‹€.

    μˆ˜μ •λ³Έ)

    def solution(new_id):
        #1
        new_id = new_id.lower()
        answer = ''
        allow = ['.','-','_']
    
        #2
        for i in range(len(new_id)):
            if new_id[i].isdigit() or 'a' <= new_id[i] <= 'z' or new_id[i] in allow:
                answer+=new_id[i]
    
        #3
        while('..' in answer):
            answer = answer.replace('..','.')
    
        #4
        if answer[0] == '.':
            answer = answer[1:] if len(answer) > 1 else '.'
        if answer[-1] == '.':
            answer = answer[:-1]
            
        #5
        if len(answer) == 0: 
            answer = 'a'
    
        #6
        if len(answer) > 15:
            answer=answer[:15]
            if answer[-1] == '.':
                answer = answer[:-1]
        #7
        while len(answer)<3:
            answer+=answer[-1]
            
        return answer

    주관적이긴 ν•˜μ§€λ§Œ 더 직관적인 μ½”λ“œκ°€ 된 것 κ°™λ‹€!
    λ‚˜μ€‘μ— 이것을 λ‹€μ‹œ λ³΄μ•˜μ„ λ•Œ κ³ μΉ  뢀뢄이 보인닀면 μˆ˜μ •ν•  μ˜ˆμ •~

     

    λŒ“κΈ€