링크: https://school.programmers.co.kr/learn/courses/30/lessons/147355
숫자로 이루어진 문자열 t
와 p
가 주어질 때, t
에서 p
와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p
가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t
="3141592"이고 p
="271" 인 경우, t
의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
p
의 길이 ≤ 18p
의 길이 ≤ t
의 길이 ≤ 10,000t
와 p
는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.t | p | result |
---|---|---|
"3141592" | "271" | 2 |
"500220839878" | "7" | 8 |
"10203" | "15" | 3 |
입출력 예 #1
본문과 같습니다.
입출력 예 #2
p
의 길이가 1이므로 t
의 부분문자열은 "5", "0", 0", "2", "2", "0", "8", "3", "9", "8", "7", "8"이며 이중 7보다 작거나 같은 숫자는 "5", "0", "0", "2", "2", "0", "3", "7" 이렇게 8개가 있습니다.
입출력 예 #3
p
의 길이가 2이므로 t
의 부분문자열은 "10", "02", "20", "03"이며, 이중 15보다 작거나 같은 숫자는 "10", "02", "03" 이렇게 3개입니다. "02"와 "03"은 각각 2, 3에 해당한다는 점에 주의하세요
여기서 문제는 p 의 길이가 다 제각각이라 바로 전 문제에서 했던 for 문 세 개 중첩해서 하는 방식이 안 통하기 때문에 이 조합을 어떻게 만드냐는 것이었다.
그러면 이제 문자열 슬라이싱을 이용해서 간단하게 코드를 만들 수 있을거 같다
for i in range(len(t) - len(p)):
if int(t[i:len(p)+i]) <= int(p):
result += 1
하지만 이렇게 했을 때 실행결과 1, 2 는 통과했지만 3 에서 오답이 발생했다. 왜일까?
그래서 다음과 같이 range 를 수정했을 때 잘 해결되는 것을 확인할 수 있었다.
def solution(t, p):
result = 0
for i in range(len(t) - len(p)+1):
if int(t[i:len(p)+i]) <= int(p):
result += 1
return result