- 시작.
기본적으로 코딩테스트에서 많이 사용되는 문자열 함수 중 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.
내 사전에 섹스란 없다!!!
'PS & SP > Syntax Practice' 카테고리의 다른 글
'찐비전공자를 위한' : C++ 2차원 벡터, 3차원 벡터 (0) | 2022.04.04 |
---|