2021 KAKAO BLIND RECRUITMENT Q1. 신규 아이디 추천
Q1. 신규 아이디 추천
프로그래머스를 통해 알고리즘 문제를 푸는 중 2021년도 KAKAO 코딩테스트 문제를 발견했다.
실제 지원하진 않았지만 공개된 문제를 바탕으로 알고리즘 유형을 파악하고 공부하고자 작성하게 되었다.
1. 문제 유형
- 문제 설명
- 문제 조건
2. 소스 코드
Python을 활용해 문제를 해결하였고 전체 소스는 다음과 같다.
def solution(new_id):
answer = ''
sCh = new_id.lower()
for ch in sCh:
if ch.isalnum() or ch in '-_.':
answer += ch
while '..' in answer:
answer = answer.replace('..','.')
answer = answer[1:] if len(answer) > 1 and answer[0] == '.' else answer
answer = answer[:-1] if answer[-1] == '.' else answer
answer = 'a' if len(answer) == 0 else answer
if len(answer) >= 16:
answer = answer[:15]
answer = answer[:-1] if answer[-1] == '.' else answer
while len(answer) < 3:
answer += answer[-1]
return answer
3. 문제 풀이
본 문제에서는 총 7단계에 거쳐 모든 조건을 만족시키는 것을 목표로 한다.
각 단계별로 매핑되는 소스 코드에 대해 간략히 설명하도록 하겠다.
1단계: new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
answer = ''
sCh = new_id.lower()
Python에서 lower()함수는 해당 문자열을 모두 소문자로 바꾼 값을 Return한다.
그러므로 소문자로 치환된 값을 sCh라는 변수에 새로 저장한다.
2단계: new_id에서 알파벳 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자를 제거합니다.
for ch in sCh:
if ch.isalnum() or ch in '-_.':
answer += ch
- 조건 1: isalnum()함수는 알파벳 or 숫자인 값에만 True 반환
- 조건 2: ch in '-_.' 을 통해 "빼기, 밑줄, 마침표"일때만 True 반환
결과적으로 두 가지 조건에 맞는 값(=2단계 조건) 만 answer에 저장된다.
3단계: new_id에서 마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환합니다.
while '..' in answer:
answer = answer.replace('..','.')
while문을 통해 answer에 '..'이 존재할 경우, 반복해서 실행되도록 한다.
replace(확인할 문자열, 치환할 문자열)을 통해 '..'에 대해 '.'으로 변경한다.
4단계: new_id에서 마침표가 처음이나 끝에 위치한다면 제거합니다.
answer = answer[1:] if len(answer) > 1 and answer[0] == '.' else answer
answer = answer[:-1] if answer[-1] == '.' else answer
- 첫번째: 처음에 마침표(.)이 나오는지 확인하고 변경하는 작업 수행
조건으로는 우선 answer의 길이가 1 이상이어야 하며 첫 문자가 마침표(.)로 시작하면 answer[1:] (=두번째 문자 ~ 끝)로 값을 변경한다.
- 두번째: 마지막 문자가 마침표(.)인지 확인하고 변경하는 작업 수행
첫번째를 통해 문자열의 길이에 대해선 보장되므로 마지막 문자가 마침표(.)로 끝난다면 answer[:-1](=첫번째 문자~끝에서 두번째)로 값을 변경한다.
5단계: new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
answer = "a" if len(answer) == 0 else answer
문자열 길이가 0이라면 "a" 대입 / 아니라면 answer 그대로 유지
6단계: new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표가 new_id의 끝에 위치한다면 끝에 위치한 마침표 문자를 제거합니다.
if len(answer) >= 16:
answer = answer[:15]
answer = answer[:-1] if answer[-1] == '.' else answer
- 조건1: 문자열의 길이가 16 이상인지 확인하고 이상이라면 answer[:15]를 통해 첫 문자부터 15개를 잘라준다.
- 조건2: 만약 마지막 문자가 마침표(.)이라면 answer[:-1]을 통해 마지막 문자를 잘라준다.
7단계: new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
while len(answer) < 3:
answer += anwer[-1]
while문을 통해 answer 길이가 3 이상 될 때까지 무한반복해준다.
answer += answer[-1]을 통해 맨 마지막 문자를 계속하여 뒤에 붙여준다.
실행 결과
위와 같이 각 단계별로 조건에 맞춰 문제를 해결해나가면 다음과 같이 정답이라는 결과가 나오는 것을 볼 수 있다.
마무리
실무에선 JAVA를 사용하다보니 JAVA로 알고리즘을 푸는 것이 더 편할 수도 있으나 Python의 편리함을 무시할 수 없어 새로 배운다는 생각으로 Python Algorithm 공부를 지속하고 있다.
문제를 해결함에 있어 함수의 기능을 완벽히 이해하고 있지 못하기 때문에 가끔 구글링 찬스를 쓰긴 하지만 언젠가 머릿 속에 다 들어와 찾아보지 않을 날을 기대해 본다.
전체 소스 git 링크
https://github.com/cho876/Algorithm/blob/master/Problem/Kakao/2021_kakao_blind_recruitment.py
Author And Source
이 문제에 관하여(2021 KAKAO BLIND RECRUITMENT Q1. 신규 아이디 추천), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cho876/2021-KAKAO-BLIND-RECRUITMENT저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)