문제 핵심
t와 p가 주어졌을 때, t에서 p와 길이가 같은 부분 문자열을 모두 만든다. 그중 숫자로 변환했을 때 p보다 작거나 같은 부분 문자열의 개수를 구하는 문제다.예를 들어 t = "3141592", p = "271"이라면 p의 길이는 3이다. 따라서 t에서 길이 3짜리 부분 문자열을 차례대로 만들어 비교해야 한다.
314, 141, 415, 159, 592처음 생각한 접근
t에서 일정 길이만큼 문자열을 잘라 리스트에 담고, 그 리스트를 순회하면서 p보다 작거나 같은 값을 세는 방식으로 접근했다. 접근 방향 자체는 맞았다. 다만 처음 코드에서는 슬라이싱 문법, 반복 범위, 비교 대상에서 오류가 있었다. 특히 숫자 2나 3을 직접 고정해서 사용하면 p의 길이가 달라지는 테스트 케이스에서 틀릴 수 있다.
len(p) 길이만큼 잘라야 하는 문제다.처음 코드에서 틀린 점
def solution(t, p):
answer = 0
num_list = []
for i in range(0,-2):
num_list.append(t[i,i+2])
for y in len(num_list):
if y<=p:
answer+=1
return answer
1. 슬라이싱 문법 오류
문자열을 구간으로 자를 때는 쉼표가 아니라 콜론을 사용해야 한다.
t[i,i+2]올바른 형태:
t[i:i+2]파이썬 슬라이싱은 문자열[시작인덱스:끝인덱스] 형태로 사용한다. 끝 인덱스는 포함되지 않는다.
2. 반복 범위 오류
range(0, -2)는 반복이 실행되지 않는다. 기본적으로 range()는 1씩 증가하므로, 0에서 시작해 -2 방향으로 이동하지 못한다. range와 슬라이싱의 인덱싱이 다르다.
이 문제에서 반복 범위는 t 안에서 p 길이만큼 자를 수 있는 시작 위치의 개수로 정해야 한다.
len(t) - len(p) + 13. len() 결과를 바로 순회하려 했다
for y in len(num_list)에서 len(num_list)는 정수다. 정수는 직접 순회할 수 없기 때문에 타입 에러가 발생한다.
인덱스를 순회하려면 range(len(num_list))를 사용하고, 값 자체를 순회하려면 리스트를 직접 순회해야 한다.
4. 인덱스와 값을 혼동했다
range(len(num_list))로 반복할 때 y는 리스트 안의 값이 아니라 인덱스다. 따라서 비교해야 하는 대상은 y가 아니라 num_list[y]다.
5. 자를 길이를 고정했다
중간에 t[i:i+3]처럼 작성했지만, 이 방식은 p의 길이가 3일 때만 맞다. 문제에서는 p의 길이가 달라질 수 있으므로 i + len(p)를 사용해야 한다.
len(p)를 기준으로 작성해야 한다.개선 방향
힌트를 통해 코드를 단계적으로 수정했다. 먼저 슬라이싱 문법을 고치고, 이후 반복 범위를 len(t) - len(p) + 1로 수정했다. 마지막으로 부분 문자열의 길이를 len(p) 기준으로 맞췄다.
t[i:i+len(p)]로 작성한다.2. 시작 인덱스는
0부터 len(t) - len(p)까지 확인한다.3.
range()의 끝값은 포함되지 않으므로 +1을 붙인다.4. 숫자 크기 비교를 명확히 하기 위해
int()로 변환한다.최종 풀이
def solution(t, p):
answer = 0
num_list = []
for i in range(0, len(t) - len(p) + 1):
num_list.append(t[i:i + len(p)])
for y in range(len(num_list)):
if int(num_list[y]) <= int(p):
answer += 1
return answer
풀이 흐름
먼저 t에서 p와 같은 길이의 부분 문자열을 모두 만든다. 시작 인덱스 i는 0부터 len(t) - len(p)까지 이동할 수 있다.
t[i:i + len(p)] 이후 만들어진 부분 문자열을 하나씩 확인하면서, int()를 사용해 숫자로 변환한 뒤 p와 비교한다. 조건을 만족하면 answer를 1 증가시킨다.
int()를 사용한 풀이가 더 명확하다.유사 유형 문제
t와 p가 주어졌을 때, t에서 p와 길이가 같은 부분 문자열을 모두 만들고, 그중 짝수인 부분 문자열의 개수를 구하는 문제를 추가로 풀었다.이 문제도 핵심 구조는 동일하다. 부분 문자열을 자르는 방식은 그대로 사용하고, 비교 조건만 짝수 판별로 바꾸면 된다.
유사 문제 풀이
def solution(t, p):
answer = 0
num_list = []
for i in range(0, len(t) - len(p) + 1):
num_list.append(t[i:i + len(p)])
for y in range(len(num_list)):
if int(num_list[y]) % 2 == 0:
answer += 1
return answer
원래 문제와 같은 점
두 문제 모두 t에서 p와 같은 길이의 부분 문자열을 만드는 것이 핵심이다. 따라서 반복 범위와 슬라이싱 방식은 동일하게 사용한다.
원래 문제와 다른 점
차이는 조건식뿐이다. 원래 문제에서는 부분 문자열이 p보다 작거나 같은지 확인했고, 유사 문제에서는 부분 문자열이 짝수인지 확인했다.
int(num_list[y]) <= int(p)유사 문제 조건:
int(num_list[y]) % 2 == 0핵심 정리
p의 길이만큼 t를 잘라 부분 문자열을 만들고, 이를 숫자로 변환해 조건을 확인하는 것이다. 처음에는 슬라이싱 길이와 반복 범위를 고정된 숫자로 생각했지만, 문제 조건은 p의 길이에 따라 달라진다. 따라서 2나 3을 직접 쓰는 대신 len(p)를 기준으로 작성해야 한다.
또한 range()의 끝값은 포함되지 않으므로, 가능한 시작 위치 개수를 계산할 때 len(t) - len(p) + 1을 사용해야 한다.
사용한 핵심 문법 정리
t[i:i + len(p)]처럼 사용한다. i부터 i + len(p) - 1 위치까지 문자열을 자른다.len()len(t)와 len(p)를 사용해 반복 범위와 자를 길이를 정했다.range(start, end)start부터 end - 1까지 반복한다. 끝값은 포함하지 않는다.len(t) - len(p) + 1t에서 p 길이만큼 자를 수 있는 시작 위치의 개수다.append()num_list에 저장할 때 사용했다.num_list[y]처럼 리스트의 특정 위치에 있는 값을 가져올 때 사용했다.int()% 나머지 연산자answer += 1len(p), 시작 인덱스 범위는 len(t) - len(p) + 1로 잡으면 된다.'TIL > 코테' 카테고리의 다른 글
| [ Python ] 시저 암호 (0) | 2026.06.25 |
|---|---|
| [ SQL ] 아픈 동물 찾기 (0) | 2026.06.24 |
| [ Python ] 최소직사각형 (0) | 2026.06.24 |
| [ Python ] 삼총사 (0) | 2026.06.19 |
| [ Python ] 이상한 문자 만들기 (0) | 2026.06.18 |
