[노씨데브 킬링캠프] 5주차 - 문제풀이: 아이디 추천

KissNode·2024년 2월 13일
0

노씨데브 킬링캠프

목록 보기
53/73

아이디 추천

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

예전에 풀었던 기록

'''
아
시뮬레이션

중복된 거 set 으로 없앨 수 있음 -> 근데 순서가 다 섞임

array.remove(a) 는 첫번째 a를 지움

양끝 . 은 strip 으로 제거할 수 있음

시

자

'''

def solution(new_id):
    answer = ''
    spc = ['~','!','@','#','$','%','^','&','*','(',')','=','+','[','{',']','}',':','?',',','<','>','/']
    
    
    new_id = list(new_id.lower())
    
    i = 0
    
    while i < len(new_id):
        if new_id[i] in spc:
            new_id.remove(new_id[i])
            i -= 1
        i += 1        
    
    st_3_id = []
    
    chk = False
    
    for i in range(len(new_id)):
        if new_id[i] == '.':
            if chk == True:
                continue
            chk = True
            st_3_id.append(new_id[i])
        else:
            chk = False
            st_3_id.append(new_id[i])
    new_id = st_3_id
    
    new_id = ''.join(new_id).strip('.')
    
    if new_id == '':
        new_id = 'a'
    
    if len(new_id) >= 16:
        new_id = new_id[0:15]
        new_id = new_id.strip('.')
        
    while len(new_id) < 3:
        new_id = new_id + new_id[-1]
             
    
    
    
    return new_id

문제 파악 [필수 작성]

단순 문자 시뮬레이션 문제

접근 방법 [필수 작성]

그냥 단순 시뮬레이션 문제

문제 주어진 조건 그대로 구현

코드 구현 [필수 작성]

def solution(new_id):
    forbidden = '~!@#$%^&*()=+[{]}:?,<>/'
    answer = ''
    
    #step1
    answer = new_id.lower()
    #print("step1:",answer)
    
    #step2
    tmp = ""
    pointer = 0
    while pointer < len(answer):
        if answer[pointer] not in forbidden:
            tmp += answer[pointer]
        pointer += 1
    answer = tmp
    #print("step2:",answer)
    
    #step3
    tmp = ""
    pointer = 0
    while pointer < len(answer):
        if answer[pointer] == '.':
            while pointer+1 < len(answer) and answer[pointer+1] == '.':
                    pointer += 1
        tmp += answer[pointer]
        pointer += 1
    answer = tmp
    #print("step3:",answer)
    
    #step4
    answer = answer.strip('.')
    #print("step4:",answer)
    
    #step5
    if len(answer) == 0:
        answer = "a"
    #print("step5:",answer)
    
    #step6
    if len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:14]
    #print("step6:",answer)
            
    #step7
    if len(answer) <= 2:
        while len(answer) <= 2:
            answer += answer[-1]
    #print("step7:",answer)
            
    return answer

배우게 된 점 [필수 작성]

새롭게 알게된 내장함수

str.isalpha() → 알파벳인지 판별

str.isdigit() → 숫자인지 판별

str.rstrip([chars]) → 오른쪽에서부터 strip

str.lstrip([chars]) → 왼쪽에서부터 strip

파이썬 (정규표현식)

import re
# 1-Line Challenge
def solution(new_id):
    return re.sub('\.{2,}', '.', re.sub('[^a-z0-9-_.]', '', new_id.lower())).strip('.')[:15].rstrip('.') + re.sub('\.{2,}', '.', re.sub('[^a-z0-9-_.]', '', new_id.lower())).strip('.')[:15].rstrip('.')[-1]*(3-min(3, len(re.sub('\.{2,}', '.', re.sub('[^a-z0-9-_.]', '', new_id.lower())).strip('.')[:15].rstrip('.')))) if re.sub('\.{2,}', '.', re.sub('[^a-z0-9-_.]', '', new_id.lower())).strip('.')[:15].rstrip('.') else 'aaa'

def solution(new_id):
		#✅ 주어진 문자열의 모든 대문자를 대응되는 소문자로 치환한다.
    step1 = new_id.lower()
		#✅ 주어진 문자열에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거한다.
		step2 = re.sub('[^a-z0-9-_.]', '', step1)
		#✅ 주어진 문자열에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환한다.
		step3 = re.sub('\.{2,}', '.', step2)
		#✅ 주어진 문자열에서 처음과 끝에 위치한 마침표(.)를 제거한다.
    step4 = step3.strip('.')
		#✅ 주어진 문자열이 빈 문자열이라면, "a"를 대입한다.
		step5 = step4 if step4 else "a"
		#✅ 주어진 문자열의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거한다.
		#✅ 제거 후 마침표(.)가 문자열의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거한다.
    step6 = step5[:15].rstrip('.')
		#✅ 주어진 문자열의 길이가 2자 이하라면, 마지막 문자를 문자열의 길이가 3이 될 때까지 반복해서 끝에 붙인다.
		step7 = step6[:]
    while len(step7) < 3:
        step7 += step6[-1]
    return step7

주의할점, 팁, 노하우, 추가 설명

정규 표현식(regex)

정규 표현식이란 프로그래밍에서 문자열을 다룰 때 문자열의 패턴을 표현하는 언어이다. 파이썬의 경우 정규 표현식을 사용하기 위해 별도의 라이브러리(re)를 import 해야 한다.

기본적인 사용법은 다음과 같다.

  • 여러 문자 중 하나 여러가지 문자 중 한 문자를 표현하기 위해서는 []기호를 사용한다. []기호 안에는 어떤 문자도 들어갈 수 있으며 -를 통해 문자의 범위를 표현할 수도 있다. 단 ^문자는 not의 의미를 갖기에 사용에 주의해야한다.
    [abc] # a, b, c 중 한 문자
    [abc123] # a, b, c, 1, 2, 3 중 한 문자
    [a-z] # a~z 중 한 문자
    [1-5] # 1~5 중 한 문자
    [a-zA-Z0-9] # 모든 알파벳, 숫자
    [^0-9] # 숫자가 아닌 모든 문자
  • 임의의 한 문자 임의의 한 문자를 표현하기 위해서는 .을 사용한다. .은 \n 문자는 표현할 수 없으며 . 문자 그 자체는 [.]로 표현할 수 있다.
    a.c # a + 임의의 문자 + c // abc, acc는 해당되지만 a\nc는 해당되지 않는다.
    a[.]c # a.c
  • 반복 횟수가 불분명한 문자열 특정 문자열이 몇 번 반복될 지 모르는 문자의 경우 , + 문자를 사용한다. 이 때 문자는 특정 문자열이 존재하지 않아도(0번 반복) 해당되지만 +문자는 적어도 1번은 반복되어야 한다.
    a*c # c, ac, aac, aaac, aaaac ....
    a+c # ac, aac, aaac, aaaac ....
  • 존재 여부가 확실하지 않은 문자 존재 여부가 확실하지 않은 문자에 대해서는 ? 기호를 통해 표현할 수 있다. 이 때 *과의 차이점은 반복은 지원하지 않는다는 점이다.
    a?c # c, ac
  • 반복 횟수의 범위를 아는 문자열 문자열의 반복 횟수를 아는 문자열의 경우 {}기호를 통해 반복 범위를 지정해 줄 수 있다. 사용 방법은 {m} 또는 {m, n}으로 사용 가능하다. {m}의 경우 문자열이 정확히 m번 반복됨을 의미하며 {m, n}은 문자열이 m이상 n이하만큼 반복됨을 의미한다. 이 때 {m, n}의 경우 m 또는 n을 생략할 수 있으며 생략된 m, n의 경우 0, 무한을 의미하게 된다.
    a{3}c # aaac
    a{1,3}c # ac, aac, aaac
    a{0,1}c # c, ac == a?c
    a{0, }c # c, ac, aac ... == a*c
    a{1, }c # ac, aac ... == a+c
    a{ ,3}c # c, ac, aac, aaac

유용한 문자열 함수 정리(파이썬)

파이썬 교재 문자열 메서드

유용한 문자열 함수 정리(자바)

자바 교재 문자열 메서드

질문 [ 필수 X ]

댓글로 또는 이곳에 질문 남겨주세요.

profile
어제보다 더, 내일보다 덜.

0개의 댓글

관련 채용 정보