포스트

슬라이딩 윈도우(sliding window) 문제: k-beauty-of-a-number

  • 문제 요약:
  • 정수 num에서 길이 k의 모든 하위 문자열(substring)을 찾아, 이 값이 num을 나눌 수 있는 경우의 수를 계산합니다.
  • 나누기 연산에서 0을 처리하지 않으면 문제가 발생할 수 있으므로 이를 고려해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
 def divisorSubstrings(self, num: int, k: int) -> int:
     num_str = str(num)
     n = len(num_str)
     k_beauty = 0 # 결과 값
     start, end = (0, k-1) # 슬라이딩 윈도우 범위 설정

     for i in range(n - (k-1)):
         divisor = int(num_str[start:end+1])
         start += 1
         end += 1
         if divisor == 0:
             pass
         elif num % divisor == 0:
             k_beauty += 1
         
     return k_beauty

개선된 코드: **

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
    def divisorSubstrings(self, num: int, k: int) -> int:
        num_str = str(num)  # 숫자를 문자열로 변환
        n = len(num_str)
        k_beauty = 0  # 결과값 초기화

        for start in range(n - k + 1):  # 슬라이딩 윈도우로 모든 k 길이 부분 문자열 확인
            divisor = int(num_str[start:start + k])  # 현재 슬라이딩 윈도우의 숫자를 int로 변환
            if divisor != 0 and num % divisor == 0:  # 0이 아닌지 확인 후 나누어떨어지는지 체크
                k_beauty += 1

        return k_beauty
  • for start in range(n - k + 1)로 **k** 길이의 모든 하위 문자열을 탐색합니다.
  • num_str[start:start + k]를 사용해 문자열에서 슬라이딩 윈도우로 하위 문자열을 추출합니다.
  • int()로 하위 문자열을 정수로 변환합니다.
  • divisor != 0** → 0인 경우는 제외.**
  • num % divisor == 0** → **divisor가 **num**의 약수인지 확인.
  • 조건을 만족하면 **k_beauty**를 증가시킵니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
solution = Solution()

# 테스트 케이스 1
print(solution.divisorSubstrings(240, 2))  # 출력: 2

# 테스트 케이스 2
print(solution.divisorSubstrings(430043, 2))  # 출력: 2

# 테스트 케이스 3
print(solution.divisorSubstrings(123456, 3))  # 출력: 0

# 테스트 케이스 4 (추가)
print(solution.divisorSubstrings(120, 2))  # 출력: 1
  • 불필요한 **start**, **end** 변수를 따로 관리하지 않아도 됩니다.
  • 슬라이딩 윈도우를 사용해 문자열을 한 번만 탐색하므로 시간 복잡도는 **O(n)입니다.**
  • divisor == 0을 올바르게 처리하여 오류를 방지합니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.