[파이썬 코딩테스트] 크기가 작은 부분 문자열

ch.2·2024년 7월 15일
0

코딩 테스트

목록 보기
11/21
post-thumbnail

문제

프로그래머스 연습 문제

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

나의 답안

def solution(t, p):
    answer = 0
    lenn = []
    for i in range(len(t) - len(p) + 1) :
        if int(t[i:i+len(p)]) <= int(p) :
            lenn.append(t[i:i+len(p)])
    answer = len(lenn)
    return answer
  • lenn = []
    문자열 t에서 p와 길이가 같은 문자열을 담을 리스트를 변수로 생성했다.

  • for i in range(len(t) - len(p) + 1) :
    i를 이후 if문에서 t의 슬라이싱 시작 인덱스로 사용하기 위해 range의 범위를 len(t) - len(p) + 1 로 설정한다. p와 길이가 같은 부분 문자열을 찾을 수 있는 시작 인덱스를 알 수 있다. 이 범위 내에서 반복문을 돌면서 각 부분 문자열의 크기와 p의 크기를 비교할 것이다.

    반복문의 범위를 range(len(p))로 설정하면 이후 if문으로 인덱싱과 슬라이싱을 이용할 수 없게 된다.

        e.g.) t ="3141592" p = "271" 일 때 len(t) = 7, len(p) = 3
         	  t에서 p와 길이가 같은 문자열은
              t[0:3], t[1:4], t[2:5], t[3:6], t[4:7], t[5:8]
              
              len(t) - len(p) + 1 = 5
              → t[5:8]

  • if t[i:i+len(p)] <= p :
    인덱싱과 슬라이싱을 통해 t의 길이와 p의 길이가 같은 t의 부분 문자열을 구하고, 이를 p와 비교하여 p보다 작거나 같은 수을 구한다.
    비교연산문 앞뒤의 인자에 int 함수를 사용하여 정수로 변환해도 되지만, 변환하지 않아도 문자열의 길이가 같기 때문에 문자열인 상태로 숫자의 대소 구분이 가능하다.

  • lenn.append(t[i:i+len(p)])
    조건을 만족하는 횟수를 구해야 하기 때문에 미리 만들어놓은 lenn 리스트에 조건을 만족하는 문자열을 추가한다.

  • answer = len(lenn)
    lenn 리스트의 길이를 구하여 조건을 만족하는 문자열의 개수를 세어 answer 변수에 저장한다.

profile
데이터 분석 공부중

0개의 댓글