[Python - ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Level1] 카카였 - μ‹ κ·œ 아이디 μΆ”μ²œ

2021. 1. 27. 02:05γ†πŸ“š Algorithm/πŸ’ͺ🏻 Python 문제 풀이

λ°˜μ‘ν˜•
 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μ‹ κ·œ 아이디 μΆ”μ²œ

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

programmers.co.kr

문제 μ„€λͺ…

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

  • μ•„μ΄λ””μ˜ κΈΈμ΄λŠ” 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κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, λ„€μ˜€κ°€ μ„€κ³„ν•œ 7λ‹¨κ³„μ˜ 처리 과정을 거친 ν›„μ˜ μΆ”μ²œ 아이디λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

μ œν•œ 사항

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

μž…μΆœλ ₯ μ˜ˆμ‹œ

풀이 κ³Όμ •

문제 자체의 κ΅¬ν˜„μ€ κ·Έλ ‡κ²Œ 어렡지 μ•Šμ•˜μ§€λ§Œ, μ§œμž˜μ§œμž˜ν•œ κ·œμΉ™λ“€μ΄ λ§Žμ•„ μ‹ κ²½μ¨μ•Όλ κ²Œ 많고 idx 접근을 많이 ν•˜λ„λ‘ κ΅¬ν˜„ν•˜μ—¬ index μ—λŸ¬κ°€ λ‚˜μ§€ μ•Šκ²Œ μ‘°μ‹¬ν•΄μ•Όν–ˆλ‹€. 처음 κ΅¬ν˜„ν–ˆμ„ λ•ŒλŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 21,22,25만 계속 ν‹€λ €μ„œ λ­”κ°€ 잘λͺ»λœκ±° κ°™λ‹€κ³  μƒκ°λ˜λŠ” level2 뢀뢄을 λ‹€μ‹œ κ΅¬ν˜„ν•˜μ˜€λ”λ‹ˆ ν•΄κ²°λ˜μ—ˆλ‹€. μ£Όμ„μ²˜λ¦¬λ‘œ levelλ³„λ‘œ μ–΄λ–»κ²Œ κ΅¬ν˜„ν–ˆλŠ”μ§€ μ μ–΄λ†“μ•˜μœΌλ‹ˆ μ°Έκ³ ν•˜λ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€ : )

import string

def level_4 (answer):
    # level 4
    while answer and answer[0] == '.':
        answer.pop(0)
    while answer and answer[-1] == '.':
        answer.pop()
    return answer

# level 2
def level_2(new_id):
    check_id = set(['-', '_', '.'])
    for word in new_id:
        if word not in string.punctuation:
            continue
        else:
            if word not in check_id:
                new_id = new_id.replace(word, '')
    return new_id

def solution(new_id):
    answer = []

    new_id = new_id.lower() # level 1
    new_id = level_2(new_id) # level 2
    # level 3
    for idx, char in enumerate(new_id):
        if char == '.' and idx < len(new_id) -1 and new_id[idx+1] =='.' :
            continue
        else:
            answer.append(char)
    answer = level_4(answer) # level 4
    # level 5
    if len(answer) == 0:
        answer = ['a']
    # level 6
    if len(answer) >= 16:
        answer = answer[0:15]
        answer = level_4(answer)
    # level 7
    if len(answer) <= 2:
        while len(answer) < 3:
            answer.append(answer[-1])
    return ''.join(answer)


if __name__ == "__main__":
    print(solution("...abc..."))
    print(solution("...!@BaT#*..y.abcdefghijklm"))
    print(solution("z-+.^."))
    print(solution("=.="))
    print(solution(".......b"))
    print(solution("123_.def"))
    print(solution(".1."))
    print(solution("3.2............3"))
    print(solution("~!@#$%^&*()=+[{]}:?,<>"))

 

λ°˜μ‘ν˜•