프로그래머스를 통해 알고리즘 문제를 푸는 중 2021년도 KAKAO 코딩테스트 문제를 발견했다.
실제 지원하진 않았지만 공개된 문제를 바탕으로 알고리즘 유형을 파악하고 공부하고자 작성하게 되었다.
- 문제 설명
- 문제 조건
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
본 문제에서는 총 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
결과적으로 두 가지 조건에 맞는 값(=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
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
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