TODAY TIL

오늘의 문제는  프로그래머스에 있는 크기가 작은 부분 문자열 였는데요.

아직 알고리즘이 익숙하지 않은 초보지만 푼 내용을 정리하기 위해서 작성해 봅니다.

 

문제 설명
주어진 숫자 문자열 t와 p가 있을 때, t에서 p와 길이가 같은 부분 문자열을 잘라내어 숫자로 변환한 뒤, 이 숫자가 p보다 작거나 같은 경우를 찾는 문제입니다.

  • 예를 들어, t = "3141592"이고 p = "271"이라면, t에서 길이가 3인 부분 문자열을 추출하여 숫자로 변환하고 271보다 작거나 같은 경우를 세어야 합니다.

입력 예시

  • t = "3141592"
  • p = "271"

출력 예시

  • 결과: 2 (141, 159 두 개의 숫자가 271보다 작음)

문제 해결 방법

이 문제를 단계별로 쉽게 풀이해보겠습니다.

  1. 부분 문자열 길이 구하기
    p의 길이와 같은 길이의 부분 문자열을 t에서 잘라낼 것입니다. 따라서, p의 길이를 미리 구해 놓습니다.
  2. 반복문으로 부분 문자열 만들기
    t에서 p의 길이만큼 부분 문자열을 하나씩 잘라내야 하므로, t를 처음부터 끝까지 순회하면서 p와 같은 길이의 부분 문자열을 만듭니다.
  3. 숫자 변환 후 비교하기
    잘라낸 부분 문자열을 숫자로 변환한 뒤, p와 비교합니다. 만약 p보다 작거나 같은 숫자라면, 이 부분 문자열은 조건에 맞는 것이 됩니다.
  4. 개수 세기
    조건에 맞는 부분 문자열이 나올 때마다 개수를 하나씩 더합니다.
  5. 최종 결과 반환하기
    반복이 끝나면 조건에 맞는 부분 문자열의 개수를 반환합니다.

코드 구현

def solution(t, p):
    length_p = len(p)  # p의 길이를 구해서 저장
    count = 0  # 조건에 맞는 부분 문자열 개수를 세기 위한 변수
    
    for i in range(len(t) - length_p + 1):  # t에서 부분 문자열을 잘라내기 위한 반복문
        substring = t[i:i + length_p]  # 부분 문자열 생성
        if int(substring) <= int(p):  # 숫자로 변환해 p와 비교
            count += 1  # 조건을 만족하면 count를 1 증가
    
    return count  # 최종 개수 반환

 

 

한 줄씩 아주 쉽게 설명하기

  1. length_p = len(p)
    • p의 길이를 구해서 length_p에 저장. 이 길이만큼 t에서 잘라냄
  2. count = 0
    • 조건에 맞는 숫자가 몇 개인지 세기 위해 처음에 count를 0으로 설정.
  3. for i in range(len(t) - length_p + 1)
    • t에서 p와 같은 길이만큼 잘라낼 건데, 한 글자씩 오른쪽으로 이동하면서 잘라냄.
    • 예를 들어, p의 길이가 3이면 t에서 첫 글자부터 3글자씩 이동하면서 반복.
  4. substring = t[i:i + length_p]
    • t의 i 위치부터 p와 같은 길이만큼 잘라내서 substring이라는 부분 문자열을 만듬.
    • 예를 들어, t = "3141592"이고 p = "271"이라면, substring이 314, 141, 415... 이렇게 돼요.
  5. if int(substring) <= int(p)
    • substring과 p를 숫자로 바꿔서 비교
    • 만약 substring이 p보다 작거나 같으면 조건을 만족
  6. count += 1
    • 조건을 만족하면 count를 1씩 더해요.
  7. return count
    • 마지막으로 조건에 맞는 개수(count)를 결과로 내보내요.

코드 예시

출력 결과

  • 예를 들어, t = "3141592"이고 p = "271"이면:
    • 314, 141, 415, 159, 592 중에서 271보다 작거나 같은 숫자는 141과 159 두 개니까, 답은 2가 됩니다.

✍️ 풀이 요약

이 문제는 주어진 문자열에서 특정 조건을 만족하는 부분 문자열을 찾아서 개수를 세는 문제입니다. p의 길이만큼 부분 문자열을 t에서 하나씩 잘라내면서, p보다 작거나 같은지를 비교하는 방식으로 간단하게 풀이할 수 있습니다.

 

문제 풀고 느낀점

  • 어떻게 풀어야 할지 생각을 많이 해서 풀게되었다.
  • 문제를 해석하고 하나하나씩 풀어나가는게 중요하다는걸 느꼈다.
  • CHAT GPT를 사용한다면 바로 답을 알려달라고 하지말고 문제 푸는 방법에 대해서 물어보자 그럼 해결방법의 힌트를 제공해준다.
  • 코드를 모르면 하나씩 설명해 달라고 하자 이해하기가 쉽다.
 

+ Recent posts