본문 바로가기

PS & SP/Syntax Practice

'찐비전공자를 위한' : Python 문자열 함수 - find, rfind, endswith, startswith

  • 시작.

기본적으로 코딩테스트에서 많이 사용되는 문자열 함수 중 4개의 활용법에 대해 써보도록 하겠습니다. 

 

저도 여러 회사 코딩테스트에 도전해보기도 하였고, 타율은 그렇게 좋지는 않습니다만^^; 그 중 운좋게 안타친 기업 중 

K사, S사가 있었네요. 

 

저는 C++를 주언어로 사용하고 있는데, 소마에 지원할 시기에는 C에서 C++로 컨버젼하는 과정에 있었습니다. 

따라서 C++ 17, 19에서 지원하는 Iterator : auto / map 자료구조들에 생소함을 느꼈고, 이들에 대한 필요성을 느꼈습니다. 

 

하지만 결국 '비전공자'의 한계인지 그토록 오래 사용한 C++였지만 이들만큼은 정말 익숙해지지 않더군요. 

 

한편 여러 코딩테스트에 응시하다보니 깨달은 한 가지 사실은,

 

꼭 한 가지의 언어로 쭉 문제를 풀지 않아도 된다는 사실이었습니다.

 

따라서 시간 효율성을 체크하는 K사 4 ~ 5번 문제부터는 Dijkstra 등 탐색 유형이 곧잘 나오는데, 이 문제를 풀 때에는 C++를 사용하고,

 

눈으로 보이는 대로 구현 + 문자열 다루기가 필요한 1 ~ 3 문제에서는 Python을 사용하기로 마음을 먹었습니다.

 

 


왜냐하면, 확실히 Python이 저처럼 char* a = "abcdef"; 이렇게 문자열을 다루고,

그러다보면 pointer array까지도 다뤄야 한다는 c++ 유저로서의 번거로움을 해결해주었기 때문입니다.

그리고, 요새 코딩테스트들이 Python / PyPy3 만으로도 시간 제한에 자유롭게 해두기 때문에..


 

주저리 주저리 말이 길었지만, 

저는 문과 중에서도 문과 상문과 출신 비전공자이기 때문에, PS를 해보며 내린 결론은

결국 많이 풀고, 많이 쓰고, 또 예제가 주어진다면, 능동적으로 본인이 다시 예제를 만들어보고,

A라는 함수를 배웠으면, B라는 문법과 같이 혼합한 모듈을 만들어보는 방식으로 익히는 방식이 잘 맞았던 것 같습니다. 

 

시작하겠습니다. 


1. find(찾을 문자, 찾기 시작할 위치, 찾기를 끝맺을 위치)

hangle = "가나다라마바사"
hangle.find('나')

리턴은 1!

hangle2 = "가나다라마바사가나다라마바사"

hangle2.find('나',3)

리턴을 8 

 

 

2. rfind

find와 같은 기능을 하는데, r, 즉 오른쪽, 문자의 맨 끝에서부터 탐색을 시작합니다.

alpha = "abcdefgabcfedf"

alpha.rfind('f')

13

print(alpha.rfind('f',1))
print(alpha.find('f'))

13

5

 

 

3. startswith

문자열의 시작이 인자로 시작하는지 확인

 

이 함수가 특히 PS 뿐만 아니라 모델에 들어온 데이터를 Preprocessing할 때도 중요합니다.

 

리턴은 Bool입니다.

test = ["alpha.txt","best.txt","random.avi","best.avi","float.txt"]

for x in test:
    if x.startswith('alpha'):
        print(x.find('a'))
        print(x)
    else:
        print('pass')

리턴은 

0

alpha.txt

pass

pass

pass

pass

 

아주 쉽지~ EZ PZ~ 

 

4. endswith

 

startswith의 반대 연산을 합니다. 

 

이 함수는 보통 어떤 데이터셋에서 확장자, 혹은 연도를 제거하려고 할 때 많이 쓰입니다.

 

리턴은 역시 bool입니다. 

for x in test:
    if x.endswith('txt'):
        print(x)
    else:
        print('pass')

 

리턴을 한번 해보세요ㅋ.ㅋ 

 

 

5. 클래스 문법에서 똑같이 적용!

<명세>

1. 사전을 구현하는 클래스를 구현하세요. 

  • 키와 밸류를 출력하는 상위 클래스를 구현합니다.
  • 아래 명세에 해당하는 함수를 가지고 있는 하위 클래스를 구현합니다.

2. 입력으로는 단어 리스트와 해당 단어의 뜻이 들어갑니다.

 

3. 함수 목록

 

  • 검색 단어가 이미 입력된 사전 클래스에 있는지 없는지를 검사하는 함수
  • 입력된 단어로 끝나는 단어의 뜻을 모두 출력하는 함수
  • 입력된 단어로 끝나는 단어가 몇 개 존재하는지 리턴하는 함수
  • 입력된 단어로 시작하는 단어가 몇 개 존재하는지 리턴하는 함수 

 

<정답은 다음과 같습니다>

class NewDict(object):
    
    def __init__(self,dict):
        super(NewDict,self).__init__()
        self.dict = dict
    
    def print_keys(self):
        keylist = list(self.dict.keys())
        for x in keylist:
            print(x)
    
    def print_values(self):
        valuelist = list(self.dict.values())
        for x in valuelist:
            print(x)
class MyDictionary(NewDict):

    def __init__(self,**kwargs):
        self.keys = kwargs['keys']
        self.values = kwargs['values']
        dicts={}
        for k,v in zip(self.keys,self.values):
            if k not in dicts:
                dicts[k]=v 
            else:
                continue
        self.dicts = dicts
        #print(self.dicts)
        super(MyDictionary,self).__init__(self.dicts)
    
    def isindict(self,target):
        if len(self.keys)==0:
            print("Your dictionary is empty")
        else:
            if target not in self.keys:
                print("{} is not in your dictionary".format(target))
            else:
                print("{} is in your dictionary".format(target))

    
    #입력된 단어로 끝나는 단어가 몇 개 존재하는지 리턴하는 함수 
    def isendswith(self,target):
        reslist=[]
        for x in self.keys:
            if x.endswith(target):
                reslist.append(x)
        print(reslist)
        #return reslist
    
    #입력된 단어로 끝나는 단어의 뜻을 리턴하는 함수
    def targetvalue(self,target):
        reslist= []
        
        for x in self.keys:
            if x.endswith(target):
                reslist.append(self.dicts[x])
        
        print(reslist)
    
    #입력된 단어로 시작하는 단어가 몇 개 존재하는지 리턴하는 함수 
    def isstartswithnum(self,target):
        cnt=0
        for x in self.keys:
            if x.startswith(target):
                cnt+=1
        print(cnt)

 

<실험>

 

keys=['광어','연어','복어','사시미','옥돔','넙치']
values=['광어 존나 맛있음','연어는 광어보단 덜..','복어는 술먹을 때만','사시미는 눈 앞에서만','넙치는 아직 안먹어봄']
test = MyDictionary(keys=keys,values=values)
test.print_keys()

답 : 

광어 

연어 

복어 

사시미 

옥돔

test.print_values()

 

답 :

광어 존나 맛있음

연어는 광어보단 덜..

복어는 술먹을 때만

사시미는 눈 앞에서만

넙치는 아직 안먹어봄

 

test.isindict('섹스')

...?

답 : 섹스 is not in your dictionary.

 

내 사전에 섹스란 없다!!!