[python_파이썬_2021 KAKAO BLIND RECRUITENT]프로그래머스_LV1_신규 아이디 추천_풀이_★컴프리헨션

2024. 6. 18. 22:06코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/f-2-t4MGKfc?feature=shared

 

처음 시작할때는 LV0의 정답률이 60%정도도 풀기 어려웠는데 이제는 LV1도 쉽지는 않지만 스스로 해결할 수 있다.

 

<첫번째 시도 : 맞았습니다.>

처음 문제를 읽고 나서 문제 지문이 글자수가 너무 길어 포기하려고 했다. 내가 느낀 프로그래머스이 문제는 간단하게 풀 수 있는 정도의 문제들이 많이 출제되는데 코드의 길이가 너무 길것으로 예상했다.

문제를 쭉 읽고 나서 어? 이거 차례로 코드를 작성하면 해결은 간단하겠네? 라는 착각을 하면서 들어갔다.

 

대부분의 조건은 문제가 없었으나, 연속되는 마침표를 한개의 마침표로 줄이고, 첫번째와 마지막의 마침표를 제거하는 부분에서 조금 헷갈렸지만 아래의 코드로 해결 할 수 있었다.

def solution(new_id):
    special = "~!@#$%^&*()=+[{]}:?,<>/"
    cnt = 1
    while cnt > 0:
        #1단계 : 대문자 -> 소문자 변경
        new_id = ''.join(i.lower() if i.isupper() else i for i in new_id) #이거 리뷰 필요
        #2단계 : 제거하기
        new_id = ''.join(i for i in new_id if i not in special)
        #3단계 : 연속되는 마침표를 줄이기 : 이게 조금 헷갈리네. 이 부분 다시 고민해보자.!
        while True:
            new_id = new_id.replace("..", '.')
            if ".." not in new_id:
                break
        #4단계 : 첫, 마지막 마침표 제거
        if new_id[0] == '.':
            new_id = ''.join(i for index, i in enumerate(new_id) if not index == 0)
        #5단계 : 비어있으면 a를 대입
        if not new_id:
            new_id += 'a'
        if new_id[-1] == '.':
            new_id = ''.join(i for index, i in enumerate(new_id) if not index == len(new_id) - 1)
        #6단계 : 16자 이상이면 15자리까지 살림, 마지막이 마침표면 삭제
        if len(new_id) >= 16:
            new_id = new_id[:15]
            if new_id[-1] == '.':
                new_id = new_id[:14]
        #7단계 : 2자 이하면 복사
        while len(new_id) < 3:
            new_id += new_id[-1]
        cnt -= 1
    return new_id

 

1. 컴프리헨션이 가끔씩 헷갈린다.

  1) 기본형 : [표현식 for 항목 in 반복가능한_객체 if 조건]

  2) else확장 : [표현식 for 항목 in 반복가능한_객체]
                       [표현식 if 조건 else 다른_표현식 for 항목 in 반복가능한_객체]

      if와 else가 for 앞에 위치하는 이유는 조건부 논리가 <표현식>의 일부로 사용되기 때문입니다. 이 구조는 읽기 쉽고 이        해하기 쉬운 방식으로 조건부 논리를 포함할 수 있도록 합니다.

  3) for중첩(평탄화) : matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

                    flattened = [element for row in matrix for element in row]
                    print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

      큰for문이 먼저 나고오 작은 for문이 뒤에 나온다.

 4) for중첩(조건부논리) : numbers = [1, 2, 3]
                                        letters = ['A', 'B', 'C']

                                        combinations = [(number, letter) for number in numbers for letter in letters]
                                        print(combinations)  # [(1, 'A'), (1, 'B'), (1, 'C'), (2, 'A'), (2, 'B'), (2, 'C'), (3, 'A'), (3, 'B'), (3, 'C')]

        개별적으로 고려해서 for 앞에 2개의 변수로 조건을 걸 수 있다.

 5) for중첩 확장 : numbers = [1, 2, 3]
                            letters = ['A', 'B', 'C']
                            combinations = [(number, letter) for number in numbers for letter in letters if number != 2]
                            print(combinations)  # [(1, 'A'), (1, 'B'), (1, 'C'), (3, 'A'), (3, 'B'), (3, 'C')]

     for뒤에 if로 조건을 걸 수 있다.

 

<다른사람풀이 참조>

이제 내 코드를 조금은 믿어도 되겠는데??? 다른 사람들 대비 그렇게 많이 부족해 보이지 않는다.

1. 정규식은 일단 보류.. 읽어만 보자.

import re

def solution(new_id):
    st = new_id
    st = st.lower()
    st = re.sub('[^a-z0-9\-_.]', '', st)
    st = re.sub('\.+', '.', st)
    st = re.sub('^[.]|[.]$', '', st)
    st = 'a' if len(st) == 0 else st[:15]
    st = re.sub('^[.]|[.]$', '', st)
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
    return st

 

2. 아래의 코드가 나와 많이 유사함. 

  1단계. 다른 문자가 나와도 new_id.lower()를 하면 무시됨.

  2단계. 나는 별도의 변수로 안되는 것들을 제외했는데, 아래는 되는 것들만 가져옴.

  3단계. (이게 가장 고민했던 부분인데) 비슷하지만 아래가 더 가독성이 좋음

            while '..' in answer:의 반복문 조건

  4단계. (이것도 나는 조금 어려웠던 부분) 비슷하지만, 나는 out of index에러로 고생함

            answer = answer[1:] if len(answer) > 1 else '.'로 해결

  추가 : answer[:-1]을 하면 마지막 요소 제외 가능

나는 그냥 어렵게 풀었을 뿐이네....

def solution(new_id):
    answer = ''
    # 1
    new_id = new_id.lower()
    # 2
    for c in new_id:
        if c.isalpha() or c.isdigit() or c in ['-', '_', '.']:
            answer += c
    # 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 answer == '':
        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
728x90
반응형