✳️ 코드 작성
def solution(t, p):
answer = 0
for i in range(0, (len(t) + 1) - len(p)):
if int(t[i:i+len(p)]) <= int(p):
answer += 1
return answer
✳️ 코드 설명
💟 answer = 0
def solution(t, p):
answer = 0
- answer는 조건을 만족하는 부분 문자열의 개수를 저장하기 위해 만든 변수
- 0으로 초기화한 상태에서 시작
💟 for문
for i in range(0, (len(t) + 1) - len(p)):
- 문자열 t에서 슬라이싱할 부분 문자열의 시작 인덱스를 설정하는 반복문
🧐 반복문의 범위에 대한 설명
문자열 t에서 기준 문자열 p와 같은 길이의 부분 문자열을 추출할 때 가능한 모든 시작점을 처리하기 위한 범위
1. 부분 문자열 길이
- p의 길이를 기준으로 t에서 같은 길이의 문자열을 추출해야함
- t에서 len(p) 길이의 부분 문자열들을 하나씩 가져온다 생각
- 예) p = '271'이면 len(p) = 3
2. 부분 문자열 추출 과정
- t에서 p와 같은 길이 부분을 추출할 때, 시작 인덱스는 t의 처음부터 마지막까지 가능하지만, 부분 문자열의 끝이 문자열 t의 마지막을 넘으면 안됨
- 예) t = "3141592"이고, p = "271"이라면
- 가능한 부분 문자열은 t[0:3], t[1:4], t[2:5], t[3:6], t[4:7]
- 여기서 t[4:7]이 마지막 부분 문자열임
3. 반복 범위 설정
- range(0, (len(t) + 1) - len(p))는 시작 인덱스 i의 범위를 결정
- len(t)는 t의 전체 길이를 의미하고, len(p)는 p의 길이를 의미
- 예) t = "3141592"이고, p = "271"이라면
- len(t) = 7이고, len(p) = 3
- 가능한 시작 인덱스의 범위는 0에서 4까지
- 이때, range(0, (7 + 1) - 3)은 range(0, 5)로 계산되며, 이는 시작 인덱스가 0, 1, 2, 3, 4임을 의미
4. 1을 더하는 이유
- 슬라이싱에서 t[i:i+len(p)]로 부분 문자열을 추출할 때, i+len(p)가 문자열의 끝을 넘으면 안됨
- range의 두 번째 인자는 포함되지 않는 상한선 이므로, range(len(t) - len(p) + 1)으로 범위를 설정해야 마지막 가능한 인덱스까지 포함 됨
- 만약 +1을 더하지 않으면, 마지막 부분 문자열을 놓치게 됨
- 예) t = "3141592"이고 p = "271"일 때,
- range(0, 5)가 아니라 range(0, 4)로 지정된다면 마지막 부분 문자열 "592"는 추출되지 않음
💟 조건문
if int(t[i:i+len(p)]) <= int(p):
answer += 1
return answer
- 문자열 t에서 인덱스 i부터 i + len(p)까지의 부분 문자열을 추출. 이 부분 문자열의 길이는 p의 길이와 동일
- nt(t[i:i+len(p)])는 추출된 부분 문자열을 정수로 변환
- int(p)는 기준 문자열 p를 정수로 변환
- 추출된 부분 문자열이 기준 문자열 p보다 작거나 같은지 (<=)를 비교
- 조건을 만족하는 부분 문자열이 있을 때마다 answer 값을 1 증가
- 조건을 만족하는 부분 문자열의 총 개수를 반환
✳️ 동작 과정 예시
t = "3141592"
p = "271"
- len(t) = 7이고, len(p) = 3이므로 range(0, 5). 즉, i = 0에서 i = 4까지 반복
- i = 0일 때, t[0:3] = "314" → int("314") = 314이므로, 314 > 271 (조건 불만족)
- i = 1일 때, t[1:4] = "141" → int("141") = 141이므로, 141 <= 271 (조건 만족 → answer += 1)
- i = 2일 때, t[2:5] = "415" → int("415") = 415이므로, 415 > 271 (조건 불만족)
- i = 3일 때, t[3:6] = "159" → int("159") = 159이므로, 159 <= 271 (조건 만족 → answer += 1)
- i = 4일 때, t[4:7] = "592" → int("592") = 592이므로, 592 > 271 (조건 불만족)
- 조건을 만족한 부분 문자열이 2개이므로, answer는 2
'📒 Today I Learn > 🐍 Python' 카테고리의 다른 글
[Python] 시저 암호 (chr, ord) (0) | 2024.09.11 |
---|---|
[Python] 최소 직사각형 (0) | 2024.09.10 |
[Python] 삼총사 문제로 삼중 for문 (0) | 2024.09.06 |
[Python] 대문자 소문자 구분과 확인 (0) | 2024.09.05 |
[Python] 3진법 뒤집기 (직접 구하기, divmod, int) (0) | 2024.09.04 |