1. 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

문자열 myString과 pat가 주어집니다. myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 5 ≤ myString ≤ 20
  • 1 ≤ pat ≤ 5
    • pat은 반드시 myString의 부분 문자열로 주어집니다.
  • myString과 pat에 등장하는 알파벳은 대문자와 소문자를 구분합니다.

코드 작성

def solution(myString, pat):
    # 맨 뒤 문장과 pat이 동일한 경우
    if myString[-len(pat):] == pat: 
        return myString
    # 문자열 사이에 pat이 위치한 경우
    idx = myString[::-1].index(pat[::-1])
    return myString[:-idx]

코드 리뷰

코드를 작성할 때, myString을 출력해야하는 경우(맨 뒷 문자열이 pat과 동일)와 문자열 사이에 pat이 존재하여 일부를 인덱싱하여 출력해야하는 경우로 나누었다. 코드에서 if ~ return 문은 맨 뒷 문자열과 pat이 동일하다면 myString을 그대로 출력하게 작성하였다. 그 다음 idx라는 변수에 myString을 뒤집었을 때 뒤집힌 pat 문자열이 위치한 인덱스를 찾아내고 그 인덱스에 -를 붙여 myString의 일부를 불러왔다.


2. 문자열이 몇 번 등장하는지 세기

문자열 myString과 pat이 주어집니다. myString에서 pat이 등장하는 횟수를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 1 ≤ myString ≤ 1000
  • 1 ≤ pat ≤ 10

코드 작성

def solution(myString, pat):
    repeat = 0
    for i in range(len(myString)-len(pat)+1):
        if pat == myString[i:i+len(pat)]:
            repeat += 1
    return repeat

코드 리뷰

myString에 pat이 등장하는 횟수를 담을 repeat이라는 변수를 지정해주었다. 일단 초기 설정은 pat의 등장횟수를 모르니 0으로 설정했다. 다음으로 myString에 pat이 몇 번 존재하는지 확인하기 위해 반복문을 돌릴 것인데, myString 전체에 대해 등장횟수를 계산하면 안된다. 잘못된 코드는 아래와 같다.

# 잘못된 코드
def solution(myString, pat):
    repeat = 0
    for i in range(len(myString)):
        if pat in myString: 
            repeat += 1
    return repeat

위의 잘못된 코드는 ‘banana’에 ‘ana’의 등장횟수를 6으로 출력할 것이다. 그리고 ‘aaaa’에 ‘aa’의 등장횟수를 4라고 출력할 것이다. 이렇게 문자열 안에 pat이 등장한다면 존재하니까 repeat 변수에 1을 계속 반복횟수만큼 더하게 된다. 이러한 이유로 range에 범위를 지정하고, myString를 인덱싱하여 문자열 사이사이에 pat이 몇 번 존재하는지를 확인해야한다. 즉, 전체 문자열(myString)에 대해 스캔할 때 한 문자열을 쪼개서 분석해야한다.

  1. i 값(반복횟수)을 0에서부터 len(myString)-len(pat)+1 로 설정한다(부분 인덱싱을 위함).
  2. myString을 부분 인덱싱하여 pat과의 일치성을 확인할 때, i번째 문자열에서부터 i+len(pat) 로 설정한다.


3. ad 제거하기

문자열 배열 strArr가 주어집니다. 배열 내의 문자열 중 “ad”라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 1 ≤ strArr의 길이 ≤ 1,000
    • 1 ≤ strArr의 원소의 길이 ≤ 20
    • strArr의 원소는 알파벳 소문자로 이루어진 문자열입니다.

코드 작성

def solution(strArr):
    return [s for s in strArr if 'ad' not in s]

리스트 컴프리헨션으로 배열 속 문자열에 ‘ad’가 존재하지 않는 경우만 포함되도록 하였다.


4. 공백으로 구분하기 1

단어가 공백 한 개로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

제한사항

  • my_string은 영소문자와 공백으로만 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string의 맨 앞과 맨 뒤에 글자는 공백이 아닙니다.

코드 작성

def solution(my_string):
    return my_string.split()


5. 공백으로 구분하기 2

단어가 공백 한 개 이상으로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

제한사항

  • my_string은 영소문자와 공백으로만 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string의 맨 앞과 맨 뒤에도 공백이 있을 수 있습니다.
  • my_string에는 단어가 하나 이상 존재합니다.

코드 작성

def solution(my_string):
    return my_string.strip().split()


📍 문제 출처


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기