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

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

문제에서 요구하는 순서대로 구현해나가면 쉽게 풀이가 가능.

단 문자열을 좀 다룰 줄 알아야 했다.

풀면서 이번에 좀 알고가야겠다 싶은 메소드들을 정리해봤다.

def solution(new_id):
    can_ch = set(['-', '_', '.'])
    
    new_id = new_id.lower()
    answer = ''
    
    for ch in new_id:
        if ch.isalnum() or ch in can_ch:
            answer += ch
            
    while ".." in answer:
        answer = answer.replace("..", ".")
        
    answer = answer.strip(".")

    if len(answer) == 0:
        answer = "a"
    elif len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:14]

    while len(answer) <= 2:
        answer += answer[-1]
    return answer

1. isalnum() 메소드

문자열이 숫자 또는 알파벳으로만 구성돼있다면 True리턴. "1", "a", "123ab"이런 거 죄다 True뱉는다는거임.

비슷하게 숫자로만 구성돼있다면 True리턴하는 isdigit(), 알파벳으로만 구성돼있다면 True를 리턴하는 isalpha()도 있다.

 

2. replace() 메소드 (참고 : replace된 문자열을 리턴함. 원본 자체를 replace해주는 건 X)

문자열 내의 특정 문자열들을 모조리 임의의 문자열로 치환해주는 기능. 첫 파라미터가 바뀔 문자열, 두 번째 파라미터가 바꿀 문자열이다. 세 번째 파라미터는 옵셔널로 몇 개의 문자열을 바꿀지를 결정해준다.

주의할 점은 replace를 통해 새롭게 꽃단장을 한(?) 문자열에도 내가 바꾸고 싶어하는 문자열이 남아있을 수 있다.

예를 들어 "..."이란 문자열에서 ..을 .으로 바꿔야 한다고 해보자.

example_string = "..."
example_string = example_string.replace("..", ".") // ..

 사실 위 문자열에서 ..은 0 ~ 1번 인덱스, 1 ~ 2번 인덱스 이렇게 2개가 있는 상황으로 서로 1번 인덱스가 겹치는 상황인데 replace는 이런 상황을 방지?하기 위해 ..을 찾았다면 그 다음 위치부터 ..을 찾는 것 같다. 즉 0 ~ 1번 인덱스가 ..이니 2번 인덱스부터 ..을 다시 찾는것. 따라서 위 상황에선 0 ~ 1번 인덱스의 ..만 교체대상이라 판단한 후 교체해주는데, 교체된 후 새로 태어난 ..에 대해선 ..이 있는지 없는지 그런 건 검사하지 않는다는 것! 

 아마 내 예상으론 앞에서부터 탐색해나가며 교체대상 문자열을 마주칠때마다 바꾸는 게 아니라 위 방법처럼 "교체대상 찾으면 그 다음 인덱스부터 찾아나가기" 방식으로 바꿔야할 애들만 다 찾아놓은 후 한꺼번에 바꾸는 식으로 하는 것 같다.

 

3. strip()메소드

문자열 양끝에 특정 문자가 있으면 그 녀석들을 제거해주는 메소드. 아무 인자도 전달하지 않으면 공백문자를 제거하는 것이 디폴트고 임의의 문자를 전달하면 그 문자들을 제거한다. 참고로  lstrip은 왼쪽 끝, rstrip은 오른쪽 끝을 제거함. 참고로 양 끝을 제거하긴 하는데, 제거한 후에도 양 끝에 파라미터로 전달받은 문자가 있으면 다시 제거하는 걸 반복한다.

+ Recent posts