Development Project

[ Programmers - 06/25 ] - 신규 아이디 추천(Python)_Level1 본문

CodingTest/Programmers

[ Programmers - 06/25 ] - 신규 아이디 추천(Python)_Level1

나를 위한 시간 2022. 6. 26. 00:30
  • 문제링크

https://programmers.co.kr/learn/courses/30/lessons/72410?language=python3 

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

 

 

 

  • 문제

 

 

 

  • 시행착오

문제를 봤을때 하나하나 순서를 알려줘서 이 문제는 틀리는 사람이 거의 없겠다고 생각했었는데, 각 단계별 지시사항을 보고 이걸 해주는 함수가 있었는데 이름이 잘 기억나지 않았다.  거기다 한번도 써본적 없는 함수도 있었기에 생각보다 오래 걸렸던 문제였다.

 

 

 

  • 문제분석

new_id : 사용자가 입력한 아이디

를 입력받아 1~7단계에 걸쳐 유효한 사용자의 아이디와 비슷하지만 유효한 아이디로 변경하여 추천해주는 것이다.

문제에서 설명을 다 하나씩 해주기 때문에 순서대로 따라 코딩하면 된다.

 

 

 

  • 각 파라미터의 유형

new_id = "...!@BaT#*..y.abcdefghijklm"

<조건> 

→  1 ≤ new_id의 길이 ≤ 1,000

→  new_id는 알파벳 대문자, 소문자, 숫자, 특수문자로 구성됨  ※ 특수문자 : -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정

=> 아이디를 나타내는 문자열이며, 위의 조건을 충족한다.

 

 

 

  • 문제접근

※ 작성자가 문제를 보고 든 생각을 차례대로 써본 것이다. 이 순번은 정답이 아니며 매번 다른 생각을 해보길 권장한다.

=> 사실 이 문제는 단계가 주어져있으므로 그대로 따라가며 코딩해보았다.

 

1) new_id의 모든 대문자를 대응되는 소문자로 치환합니다.

=> lower()함수로 소문자로 바꿀 수 있다. 반복문을 돌면서 한글자가 아스키코드로 대문자에 속하면 소문자로 바꾸는 식으로 구현은 할 수 있지만, lower() 함수가 더 간단하고 복잡하지 않아 그대로 쓰기로 했다.


2) new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.

=> replace를 생각했지만, 제외한 모든 문자라서 코드만 엄청 길어질 것 같아 다른 방법을 생각하기로 했다. 현재 문자가 영어나 한글 숫자일 경우에만 참을 반환하는 isalnum() 함수를 통해 1차적으로 특수문자 인지 아닌지를 구분해서, 영어 한글 숫자이거나 특수문자 -_.인 경우에만 문자열에 추가한다.


3) new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.

==> 이 부분도 단순 replace를 생각했지만 replace("..",".")로만 사용하기에는 점이 3개이상 연속될 경우에는 점 한개만으로 치환되지 않기때문에, in 명령어 (안에 포함되어있는지를 true, false로 판단해줌)을 이용해 점 두개가 연속된게 문자열에 포함되어 있다면 이를 한개로 바꾸는 작업을 반복하게 하는것이 효율적이라 생각했다.

 

4) new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.

==> 간단히 조건문을 이용해 마침표가 처음[0번째]이나 끝[-1번째]에 위치하는지 판단하고, 존재하면 슬라이싱을 이용해 제거할 수 있다. 


5) new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.

==> 빈 문자열을 판단하는 방법은 문자열=' ' 이거나 문자열의 길이가 0일때 이므로, 이를 이용해 대입하면 된다.


6) new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.

==> 요구사항 그대로 15자까지만 슬라이싱을 한 뒤, 마지막 글자가 마침표라면 하나줄여서 슬라이싱을 해준다.


7) new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

==> 문자 혹은 문자열을 반복해서 뒤에 붙이는 방법은 *연산자를 사용하면 된다. 

 

 

 

  • 최종코드
def solution(new_id):
    answer = ''
    for word in new_id.lower():
        if word.isalnum() or word in '-_.':
            answer += word
    while '..' in answer:
        answer = answer.replace('..', '.')
    answer = answer[1:] if answer[0] == '.' and len(answer) > 1 else answer
    answer = answer[:-1] if answer[-1] == '.' else answer
    answer = 'a' if answer == '' else answer
    if len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]
    if len(answer) <= 3:
        answer = answer + answer[-1] * (3-len(answer))
    return answer
Comments