슬라이딩 윈도우(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 라이센스를 따릅니다.