코린이의 개발 일지

[파이썬 코딩테스트] 신규 아이디 추천 (2021 Kakao blind recruitment) 본문

파이썬 코딩테스트 연습

[파이썬 코딩테스트] 신규 아이디 추천 (2021 Kakao blind recruitment)

폴라민 2022. 1. 8. 00:07
반응형

오늘은 작년 카카오에서 출제 되었었던 코딩테스트 문제를 가지고 왔습니다.

 

이 포스팅에는 해당 문제에 대한 정답이 나와있으니 아직 안풀어 보신 분들은 아래 사이트 혹은 백준 사이트에 가서 문제를 풀어보고 오시길 바랍니다.

 

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

 

그럼 시작하겠습니다.

 

문제는 조금 복잡해 보여도 크게 어렵지는 않았는데요, 해결하는 목적뿐만 아니라 조금 간단하게 해결할 수 있는 방법을 생각하며 코드를 짜 보았습니다.

 

from string import ascii_lowercase

def solution(new_id):
    possible=['.','-','_']
    alphabet_list = list(ascii_lowercase)
    number=list(map(str,range(10)))
    
    answer = ""
    # 1단계
    answer=new_id.lower()
    lst=list(answer)
    ans_lst=[]
    # 2단계, 3단계
    for i in lst:
        if i in possible:
            if ans_lst:
                if ans_lst[-1]=="." and i==".":
                    continue
            ans_lst.append(i)
            continue
        elif i in alphabet_list:
            ans_lst.append(i)
            continue
        elif i in number:
            ans_lst.append(i)
            continue
    # 4단계
    if ans_lst and ans_lst[0]=='.':
        ans_lst.pop(0)
    if ans_lst and ans_lst[-1]==".":
        ans_lst.pop()
    # 5단계
    if not ans_lst:
        ans_lst=["a"]
    # 6단계
    if len(ans_lst)>15:
        ans_lst=ans_lst[:15]
        if ans_lst[-1]==".":
            ans_lst.pop()
    # 7단계
    if len(ans_lst)<3:
        while len(ans_lst)!=3:
            ans_lst.append(ans_lst[-1])
    answer="".join(ans_lst)
    return answer

간단하게 짜보려고 애를 써보았는데.. 아직 갈길이 멀었나 봅니다. 

프로그래머스는 문제를 해결하면 다른 사람의 풀이를 볼 수 있는데요, 역시나 고수들의 풀이는 남다릅니다.

 

눈에 띄었던 점 몇개를 꼽아 보자면 우선

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

for c in new_id:
	if c.isalpha() or c.isdigit() or c in ['-','_','.']:
    	answer += c

이 부분이었는데요, isalpha()와 isdigit() 메소드를 활용해서 아주 간단하게 알파벳과 숫자를 판별해 냈습니다. 

나는 왜 이 함수를 몰랐던가

아쉬움이 많이 남지만 그래도 이제라도 알았으니 잘 활용해 보죠.

여기서 isalpha() 는 문자열 전체가 알파벳으로 구성되어 있으면 true를 리턴하고 그 외에는 false를 리턴 합니다.

주의할 점은 문자열에 숫자 및 공백이 포함되어 있으면 False를 리턴합니다.

 

isdigit()도 마찬가지 입니다. 숫자열이 숫자로만 구성되어 있을 경우 true를 리턴합니다. 

주의할점은 isdigit은 '-'와 '.' 도 문자로 구분하기 때문에 소수점이나 음수를 판별할 수 없습니다.

 

또 흥미롭게 봤던 부분은 

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

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

이 부분 이었습니다. 이게 3번째 부분인데 여기서 꽤 고민하신 분들이 많았을 겁니다.

저도 여기서 고민을 꽤 했는데, 이렇게 간단한 아이디어가 있었네요.

 

while문으로 반복을 해주니 "....."같이 점이 연속으로 나와도 해결 가능합니다.

 

 

아예 다른 방식의 접근으로 정규 표현식을 사용한 풀이가 있었는데, 엄청 간결합니다.

 

저는 아직 정규표현식에 대해 공부하지 않았는데 그 풀이를 보니 공부를 해봐야겠다는 생각이 들더군요.

 

 

주말 동안 정규 표현식 공부해서 관련 포스팅을 올려보도록 하겠습니다.

 

 

 

그럼 여러분 모두 즐코하세요!

반응형
Comments