https://programmers.co.kr/learn/courses/30/lessons/72410
문제에서 요구하는 순서대로 구현해나가면 쉽게 풀이가 가능.
단 문자열을 좀 다룰 줄 알아야 했다.
풀면서 이번에 좀 알고가야겠다 싶은 메소드들을 정리해봤다.
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은 오른쪽 끝을 제거함. 참고로 양 끝을 제거하긴 하는데, 제거한 후에도 양 끝에 파라미터로 전달받은 문자가 있으면 다시 제거하는 걸 반복한다.