[Programmers] - 신규 아이디 추천

오동훈·2021년 3월 18일
0

Programmers

목록 보기
19/64
post-thumbnail

1. Problem 📃

https://programmers.co.kr/learn/courses/30/lessons/72410


다음 문제는, 입력된 값을 주어진 조건에 따라 결과를 출력하는 문제입니다.

2. Logic 👨‍🏫

1. 첫번째 코드 logic

  1. lower() 이용
  2. 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 인 경우 append를 이용해 문자를 추가 && append를 이용하면 리스트 형태로 되기 때문에 추가된 문자열을 join을 이용해 합쳐주기
  3. replace를 이용해 점(.)이 두개인 것들을 한개로 치환해주기
  4. 다른 방법을 생각해봤는데 도무지 안돼서 맨앞 또는 맨뒤에 있는 경우 슬라이싱을 이용해 문자열을 잘라주기
  5. 말그대로 빈 문자열이라면 a를 넣어주고 아니면 패쓰~
  6. 문자열 길이가 16 이상인경우, 15자까지만 슬라이싱 이용 및 마지막 문자가 점(.)이라면 제거
  7. 입력된 문자열의 길이가 2자 이하라면, 마지막 문자를 이용해 3이 될때까지 슬라이싱을 이용해 이어붙이기

3. Code 💻

1. 내가 푼 코드

def solution(new_id):
    answer = []
    new_id = new_id.lower()				# 1번 조건
    for i in range(len(new_id)):		# 2번 조건
        if new_id[i].isalpha():
            answer.append(new_id[i])
        elif new_id[i].isalnum():
            answer.append(new_id[i])
        elif new_id[i] == '-':
            answer.append(new_id[i])
        elif new_id[i] == '_':
            answer.append(new_id[i])    
        elif new_id[i] == '.':
            answer.append(new_id[i])
    answer = "".join(answer)
    for i in range(len(answer)):		# 3번 조건
        answer = answer.replace("..", ".") 
    while answer:						# 4번 조건
        if answer[0] == '.':
            answer = answer[1:]
        elif answer[-1] == '.':
            answer = answer[:-1]
        else:
            break
    if answer == "":					# 5번 조건
        answer = "a"
    if (len(answer) >= 16):				# 6번 조건
        answer = answer[:15]
        if answer[-1] == ".":
            answer = answer[:14]
    if (len(answer) <= 2):				# 7번 조건
        while len(answer) < 3:
            answer += answer[-1]
    return answer

2. 다른 사람이 푼 코드

import re

def solution(new_id):
    st = new_id
    st = st.lower()
    st = re.sub('[^a-z0-9\-_.]', '', st)
    st = re.sub('\.+', '.', st)
    st = re.sub('^[.]|[.]$', '', st)
    st = 'a' if len(st) == 0 else st[:15]
    st = re.sub('^[.]|[.]$', '', st)
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
    return st

4. Feedback 📚

4.1 문자열 변경 - replace

★★★★★ 제일 중요한 부분: replace 하게 되면 반환값을 꼭 저장 해줘야합니다. 그렇지 않으면 값이 바뀌지 않습니다.

Prototype: replace(old, new, [count]) -> replace("찾을값", "바꿀값", [바꿀횟수])

text = '123,456,789,999'

replaceAll= text.replace(",","")
replace_t1 = text.replace(",", "",1)
replace_t2 = text.replace(",", "",2)
replace_t3 = text.replace(",", "",3)

print("결과 :")
print(replaceAll)
print(replace_t1)
print(replace_t2)
print(replace_t3)

'''
결과 : 
123456789999
123456,789,999
123456789,999
123456789999
'''

4.2 정규 표현식

다른 사람 코드에서 정규 표현식을 이용해 이 문제를 너무나도 간단히 해결했다. 그래서 정규 표현식이란 무엇인지 한번 공부해보려 한다.

4.2.1 메타 문자

📝 메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용되는 문자를 말한다. 정규 표현식에서 사용하는 메타 문자에는 다음과 같은 것이 있다.

. ^ $ * + ? { } [ ] \ | ( )

4.2.2 자주 사용하는 문자 클래스

[0-9] 또는 [a-zA-Z] 등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.

  • \d - 숫자와 매치, [0-9]와 동일한 표현식이다.
  • \D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
  • \s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
  • \S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
  • \w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
  • \W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.

🔔 대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다. 🔔

4.2.3 반복(*)

ca*t

이 정규식에는 반복을 의미하는 메타 문자가 사용되었다. 여기에서 사용한 은 *바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미입니다.

정규식문자열Match 여부설명
ca*tctYes"a"가 0번 반복되어 매치
ca*tcatYes"a"가 0번 이상 반복되어 매치 (1번 반복)
ca*tcaaatYes"a"가 0번 이상 반복되어 매치 (3번 반복)

4.2.4 반복(+)

ca+t

반복을 나타내는 또 다른 메타 문자로 +가 있다. +는 최소 1번 이상 반복될 때 사용한다. 즉 *가 반복 횟수 0부터라면 +는 반복 횟수 1부터인 것이다.

정규식문자열Match 여부설명
ca+tctNo"a"가 0번 반복되어 매치되지 않음
ca+tcatYes"a"가 1번 이상 반복되어 매치 (1번 반복)
ca+tcaaatYes"a"가 1번 이상 반복되어 매치 (3번 반복)

4.2.5 파이썬에서 정규 표현식을 지원하는 re 모듈

📝 파이썬은 정규 표현식을 지원하기 위해 re(regular expression의 약어) 모듈을 제공한다. re 모듈은 파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리로 사용 방법은 다음과 같다.

>>> import re
>>> p = re.compile('ab*')
profile
삽질의 기록들🐥

0개의 댓글