프로그래밍-학습기록/코딩테스트

치욕스런 날코딩, 정규표현식 배워야겠다는 다짐

leesche 2021. 3. 1. 19:30

프로그래머스 | level 1 | Python | 신규 아이디 추천

문제 링크

def solution(new_id):
    new_id = new_id.lower()
    new_id = validateAllLetters(new_id)
    new_id = removeDubleDot(new_id)
    new_id = removeDotOfFrontAndRear(new_id)
    new_id = handleEmptyId(new_id)
    new_id = handleLongId(new_id)
    new_id = handleShortId(new_id)
    return new_id

def validateAllLetters(id):
    new_id = ""
    for letter in id:
        if letter.isalpha() or letter.isdigit() or letter in ["-", "_", "."]:
            new_id += letter
    return new_id

def removeDubleDot(id):
    while ".." in id:
        id = id.replace("..", ".")
    return id

def removeDotOfFrontAndRear(id):
    if id == ".":
        return ""
    if id[0] == ".":
        id = id[1:]
    if id[-1] == ".":
        id = id[:-1]
    return id

def handleEmptyId(id):
    if id == "":
        return "a"
    return id

def handleLongId(id):
    if len(id) >= 16:
        id = id[:15]
        if id[-1] == ".":
            id = id[:-1]
    return id

def handleShortId(id):
    if len(id) <= 2:
        lastLetter = id[-1]
        while len(id) < 3:
            id += lastLetter
    return id

print(solution("...!@BaT#*..y.abcdefghijklm") == "bat.y.abcdefghi")
print(solution("z-+.^.") == "z--")
print(solution("=.=") == "aaa")
print(solution("123_.def") == "123_.def")
print(solution("abcdefghijklmn.p") == "abcdefghijklmn")

카카오 문제답게 문제가 일단 길~었다. 그 길이에 압도되면 안 된다. 많은 텍스트에 비해 문제의 난이도는 그렇게 어렵지 않다. 그냥 문제에서 시키는 대로 풀면 된다. 하지만 그 방법이 ... 위와 같이 날코딩이었다.

일단 느낌상으로 문자열을 어떤 조건에 따라 계속 수정하는 것이니 '정규표현식'을 쓰면 되지 않을까, 해서 정규표현식을 검색해서 찾아봤는데 너무 어려웠다. 하지만 level 1이니까 빨리 풀고 싶어서 결국 날코딩으로 해결해버렸다.

그렇게 풀고 다른 사람 풀이를 보니 아니나 다를까, 멋들어지게 정규표현식을 쓴 풀이 등장. 츄욱 의기소침해졌다. 나도 정규표현식 배워야 겠다고, 주르르 코딩이 아니라 호로록! 코딩을 하겠다 다짐하게 되는 문제였다.

필요했던 개념

  • isalpha(), isdigit()
  • replace()
  • 정규표현식