🌞Algorithm/πŸ”₯programmers

[programmers] μ‹ κ·œ 아이디 μΆ”μ²œ - 2021 KAKAO BLIND RECRUITMENT

λΏŒμ•Ό._. 2021. 1. 27. 23:00

μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 2021 KAKAO BLIND RECRUITMENT


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

문제 μ„€λͺ…

 

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

- μ•„μ΄λ””μ˜ κΈΈμ΄λŠ” 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에 λ‚˜νƒ€λ‚  수 μžˆλŠ” νŠΉμˆ˜λ¬ΈμžλŠ” -_.~!@#$%^&*()=+[{]}:?,<>/ λ‘œ ν•œμ •λ©λ‹ˆλ‹€.

 

 

문제 풀이

   - my solution

def solution(new_id):
    answer = ''
    
    new_id=new_id.lower() #1단계
    
    new_id=list(new_id) #list둜 λ³€ν™˜
    
    i=0
    while(i<len(new_id)): #2단계
        x=new_id[i]
        if(x.isalpha() or x.isdigit() or x=='-' or x=='_' or x=='.'):
            i+=1
            pass
        else:
            del new_id[i]
    
    i=0
    if(len(new_id)!=0):
        while (i<len(new_id)-1): #3단계
            if(new_id[i]=="." and new_id[i]==new_id[i+1]):
                del new_id[i+1]
            else:
                i+=1
    
    #4단계
    if(len(new_id)!=0):
        if(new_id[0]=='.'):
            del new_id[0]
    if(len(new_id)!=0):
        if(new_id[-1]=='.'):
            del new_id[-1]
    
    #5단계
    if(len(new_id)==0):
        new_id.append("a")
    
    #6단계
    if(len(new_id)>=16):
        new_id=new_id[:15]
        if(new_id[-1]=='.'):
            del new_id[-1]
    
    #7단계
    while(len(new_id)<=2):
        new_id.append(new_id[-1])
        
    
    answer=''.join(new_id)
    return answer

  문제 κΈΈμ΄λŠ” κΈΈμ§€λ§Œ 아이디 μΆ”μ²œ 단계에 λ§žμΆ”μ–΄ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜λ©΄ ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€.

    1단계 lower()λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  λŒ€λ¬Έμžλ₯Ό μ†Œλ¬Έμžλ‘œ μΉ˜ν™˜ ν›„ μ‰½κ²Œ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ list둜 λ°”κΏˆ

    2단계 λ¬Έμžμ—΄μ„ μˆœνšŒν•˜λ©° μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, λΉΌκΈ°(-), 밑쀄(_), λ§ˆμΉ¨ν‘œ(.)λ₯Ό μ œμ™Έν•œ λͺ¨λ“  문자λ₯Ό 제거

    3단계 λ¬Έμžμ—΄μ˜ 길이가 0이 아닐 λ•Œ λ§ˆμΉ¨ν‘œκ°€ 2번 이상 μ—°μ†λœ 뢀뢄을 μ œκ±°ν•˜μ—¬ ν•˜λ‚˜λ§Œ 남겨둠

    4단계 λ¬Έμžμ—΄μ˜ 길이가 0이 아닐 λ•Œ μ²˜μŒμ΄λ‚˜ 끝에 λ§ˆμΉ¨ν‘œκ°€ μœ„μΉ˜ν•œλ‹€λ©΄ 제거

    5단계 λ¬Έμžμ—΄μ˜ 길이가 0일 λ•Œ a λŒ€μž…

    6단계 λ¬Έμžμ—΄μ˜ 길이가 16자 이상이면 15μžκΉŒμ§€ λŠμ€ ν›„ λ§ˆμ§€λ§‰μ— λ§ˆμΉ¨ν‘œκ°€ μœ„μΉ˜ν•˜λ©΄ 제거

    7단계 λ¬Έμžμ—΄μ˜ 길이가 2자 μ΄ν•˜μΌ λ•Œ, λ§ˆμ§€λ§‰ 문자λ₯Ό λ¬Έμžμ—΄ 길이가 3이 될 λ•ŒκΉŒμ§€ μΆ”κ°€

 

  μ²˜μŒμ— μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜μ˜€μ„ λ•Œ λͺ¨λ“  ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό ν†΅κ³Όν•˜μ§€ λͺ»ν•˜μ˜€λ‹€.

  3단계, 4λ‹¨κ³„μ—μ„œ λ¬Έμžμ—΄μ˜ 길이가 0일 λ•Œμ˜ 경우λ₯Ό μ²˜λ¦¬ν•΄μ£Όμ§€ μ•Šμ•„ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” κ²ƒμ΄μ—ˆλ‹€.

  κ·Έλž˜μ„œ 쑰건문을 μΆ”κ°€ν•˜μ—¬ λͺ¨λ“  ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό 톡과할 수 μžˆμ—ˆλ‹€.


좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅, https://programmers.co.kr/learn/challenges