[ Python ] 크기가 작은 부분문자열

2026. 6. 23. 17:33·TIL/코테
[Programmers/Python] 크기가 작은 부분문자열 풀이 정리
문제 링크: Programmers - 크기가 작은 부분문자열
문자열에서 일정한 길이의 부분 문자열을 잘라 숫자로 비교하는 문제다. 핵심은 슬라이싱 범위와 비교 기준을 정확히 잡는 것이다.

문제 핵심

문자열 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) + 1

3. 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) 기준으로 맞췄다.

1. 슬라이싱은 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) + 1
t에서 p 길이만큼 자를 수 있는 시작 위치의 개수다.
append()
리스트에 값을 추가한다. 이번 풀이에서는 만든 부분 문자열을 num_list에 저장할 때 사용했다.
리스트 인덱싱
num_list[y]처럼 리스트의 특정 위치에 있는 값을 가져올 때 사용했다.
int()
문자열 형태의 숫자를 정수로 변환한다. 숫자 크기 비교나 짝수 판별을 할 때 사용했다.
% 나머지 연산자
유사 문제에서 짝수 여부를 판별할 때 사용했다. 어떤 수를 2로 나눈 나머지가 0이면 짝수다.
answer += 1
조건을 만족하는 부분 문자열을 찾을 때마다 개수를 1씩 증가시킨다.
 정리하면, 이 유형은 슬라이딩 윈도우처럼 일정한 길이의 문자열을 한 칸씩 이동하며 확인하는 문제다. 자를 길이는 len(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
'TIL/코테' 카테고리의 다른 글
  • [ SQL ] 아픈 동물 찾기
  • [ Python ] 최소직사각형
  • [ Python ] 삼총사
  • [ Python ] 이상한 문자 만들기
yustitix
yustitix
Semiconductor Process & Quality Data Analyst Candidate, M.S. in Polymer Engineering, @Yustitix </br> Aspiring Semiconductor Process & Quality Data Analyst, aiming to grow into a Manufacturing AI Data Scientist.
  • yustitix
    데분하다
    yustitix
  • 전체
    오늘
    어제
    • 분류 전체보기 (52)
      • Portfolio (4)
      • Job search (9)
        • JD (3)
        • Article study (5)
        • News room (1)
      • TIL (35)
        • TIL (2)
        • 코테 (11)
        • Python (6)
        • 머신러닝 (6)
        • 기초 통계 (3)
        • 반도체 공정 입문 (7)
      • Project (4)
        • FAERS 이상사례 자가보고 데이터 기반 모니터링.. (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
yustitix
[ Python ] 크기가 작은 부분문자열
상단으로

티스토리툴바