요즘 Code Kata를 푸는 방식이 굳어지고 있다는 것을 느꼈습니다.
다른 사람들의 풀이를 보면서 반성해보는 시간을 갖기 위해
CodeWars를 짬짬히 풀어보려고 합니다.

1. Question

Trolls are attacking your comment section!

A common way to deal with this situation is to remove all of the vowels from the trolls' comments, neutralizing the threat.

Your task is to write a function that takes a string and return a new string with all vowels removed.

For example, the string "This website is for losers LOL!" would become "Ths wbst s fr lsrs LL!".

Note: for this kata y isn't considered a vowel.

2. My Solution

def disemvowel(string):
    vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
    for character in string:
        if character in vowels:
          string = string[:string.find(character)]+string[string.find(character)+1:]
    return string

input string의 모든 character에 하나하나 접근해서 vowel인지 확인했고
vowel이라면 그 character 바로 앞까지의 string과
바로 뒤의 character부터의 string끝까지를 붙였습니다.

3. Method For Best Solution

python은 string타입에 대해 translate메서드를 제공합니다.

str.translate(table[, deletechars])

translate 메서드를 사용하기 위해
str.maketrans 메서드에 대해 공부할 필요가 있습니다.

str.maketrans메서드는 str.translate() 에 사용할 수 있는 table을 리턴해줍니다. 문법은 다음과 같습니다.

str.maketrans(x[, y[, z]])
  1. argument가 1개일 때
    dictionary타입을 인자로 넣어줘야 합니다.
    dictionary의 key,value로 mapping table이 만들어집니다.
    >>> test_dict={'a':None, 'e':None}
    >>> str.maketrans(test_dict)
    {97: None, 101: None}
original value convert value
a None
e None
  1. argument가 2개일 때
    같은 길이의 string을 넣어줘야 합니다.

첫번째 인자로 받은 string과
두번째 인자로 받은 string의
같은 index의 character들끼리 mapping됩니다.

>>> intab = "aeiou"
>>> outtab = "12345"
>>> trantab = str.maketrans(intab, outtab)
>>> trantab
{97: 49, 101: 50, 105: 51, 111: 52, 117: 53}
original vlaue convert value
a 1
e 2
i 3
o 4
u 5
  1. argument가 3개일 때
    3번째 인자로 들어오는 인자는 None으로 맵핑되는 chracter들을 명시하는 string입니다.
>>> intab='abcd'
>>> outtab='efgh'
>>> none_map='abxy'
>>> str.maketrans(intab,outtab,none_map)
{97: None, 98: None, 99: 103, 100: 104, 120: None, 121: None}

intab과 outtab에 의해 첫번째 mapping은 다음과 같습니다.

origina value convert value
a e
b f
c g
d h

그리고 none_map이라는 세번째 인자가 None으로 mapping될 character들을 명시함으로써 mapping은 다음과 같이 바뀝니다.

origina value convert value
a None
b None
c g
d h
x None
y None

4. Best Solution

def disemvowel(string):
    return string.translate(str.maketrans('','','aeiouAEIOU'))

천천히 위 Solution을 따져보겠습니다.

str.maketrans('','','aeiouAEIOU')

위 메서드로 인해 다음과 같은 테이블을 만듭니다.

original value convert value
a None
e None
i None
o None
u None
A None
E None
I None
O None
U None

그뒤에 string.translate(table)메서드를 사용해서 string을 table에 맞게 translate합니다.