본문 바로가기
파이썬/파이썬 알고리즘

파이썬 프로그래머스 level 1. 신규 아이디 추천

by Go! Jake 2021. 4. 28.

  문제

신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.

 

  풀이

def solution(new_id):
    answer = ""

    # 1 소문자 만들기
    new_id = new_id.lower()
    # 2 소문자, 숫자, 빼기, 밑줄, 마침표만 사용
    for value in new_id:
        if value.islower() or value.isdigit() or value in ["-", "_", "."]:
            answer += value

    # 3 . 두번 이상 반복되는 경우 .로 변경
    while '..' in answer:
        answer=answer.replace('..', '.')
        print(answer)

    # 4 .가 처음이나 끝에 위치하면 삭제
    if answer[0] == ".":
        if len(answer) >= 2:
            answer = answer[1:]
        else:
            answer="."

    if answer[-1] == ".":
        answer = answer[:-1]

    # 5 빈 문자열인 경우 a 대입
    if answer == "":
        answer = "a"
    # 6 16자리 이상인 경우 15자리까지 변경
    if len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == ".":
            answer = answer[:-1]

    # 7 2자 이하인 경우 마지막 문자 추가
    while len(answer) < 3:
        answer += answer[-1]

    return answer

 

이 문제는 기본적인 문자열 변경과 구조에 대해 알고 있어야 한다. 문자열의 index와 문자열 관련 함수를 알고 있어야 쉽게 풀 수 있는 문제이다. 내 풀이는 복잡한 부분이 있어 모범답안을 참조하였다.

 

이 문제는 문자열에 대한 판별, 수정, 추가, 삭제 등을 이해하고 있는지가 주요한 문제였다.

 

<1> 소문자 만들기

    # 1 소문자 만들기
    new_id = new_id.lower()

파이썬에서 문자열 내에 모든 알파벳을 소문자로 변경 해 준다. 반대로 .upper()로 사용하면 대문자로 바꿀 수 있다.

 

<2> 소문자, 숫자, 빼기, 밑줄, 마침표만 사용

    # 2 소문자, 숫자, 빼기, 밑줄, 마침표만 사용
    for value in new_id:
        if value.islower() or value.isdigit() or value in ["-", "_", "."]:
            answer += value

value.islower() - 문자열이 모두 소문자인 경우 True, 하나라도 아닌 경우 False를 표출합니다.

value.isdigit() - 문자열이 모두 숫자인 경우 True, 하나라도 아닌 경우 False를 표출합니다.

value in ["-", "_", "."] - 파이썬의 장점은 in과 not in이다. 여러 조건이 있는 경우 이와 같이 in을 사용하도록 한다.

answer += value - 위 조건을 통과한 문자열은 answer에 추가한다.

 

<3> 두번 이상 반복되는 경우 .로 변경

    while '..' in answer:
        answer=answer.replace('..', '.')
        print(answer)

 answer.replace('..','.') - 문자열에서 replace 함수는 문자열의 값을 변경하도록 해 준다. 따라서 ..를 .로 변경하게 되며, answer 내에 ..이 없을 때까지 이를 반복한다.

 

 

 

<4> .가 처음이나 끝에 위치하면 삭제

    # 4 .가 처음이나 끝에 위치하면 삭제
    if answer[0] == ".":
        if len(answer) >= 2:
            answer = answer[1:]
        else:
            answer="."
            
    if answer[-1] == ".":
        answer = answer[:-1]

문자열 index 사용하여 첫 번째 인덱스인 [0]의 값이 "."인 경우 슬라이싱으로 [1:] 두 번째부터의 값이 입력되도록 한다.

이 때 answer의 문자열이 1개인 경우 index out of range 에러가 발생하므로 길이가 2 이상일 때에 이를 사용한다.

길이가 1인 경우 "."로 따로 정의한다.

 

[-1] 인덱스를 사용하는 경우 끝 값이다.

 

<5> 빈 문자열인 경우 a 대입

    # 5 빈 문자열인 경우 a 대입
    if answer == "":
        answer = "a"

""와 같이 빈 경우 a를 입력한다. 빈 문자열이 ""를 쓴다는 점을 기억하도록 한다.

 

<6> 16자리 이상인 경우 15자리까지 변경

    # 6 16자리 이상인 경우 15자리까지 변경
    if len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == ".":
            answer = answer[:-1]

슬라이싱을 이용하여 15자리까지로 변경한다. 이 때 끝 값이 "."이 되면, 이를 제거한다.

 

<7> 2자 이하인 경우 마지막 문자 추가

    # 7 2자 이하인 경우 마지막 문자 추가
    while len(answer) < 3:
        answer += answer[-1]

    return answer

answer의 값이 3 미만인 경우 마지막 값을 문자열 더하기 연산을 통해 계속해서 덧붙여준다.

 

 

댓글