250823 하기 싫어서 놀았다
오늘 내일은 바쁨 코테 쉬운거만 5개씩 하기
- 이진변환 반복하기
- 예산
- 3진법 뒤집기
- 삼총사
- 이상한 문자 만들기
- 숫자의 표현 ok - 포스팅, 시간날 때 투포인터(슬라이딩 윈도우)로
미술관
- 드영미술관 ok
숫자의 표현
등차수열
class Solution {
public int solution(int n) {
int count = 0;
for (int k = 1; k * (k - 1) / 2 < n; k++) {
int numerator = n - k * (k - 1) / 2;
if (numerator % k == 0) {
count++;
}
}
return count;
}
}
등차수열의 합 공식
- 여기서는 숫자가 1 간격으로 늘어남
1 + 2 + 3 + ... + (k-1)
합 = (첫째 수 + 마지막 수) * 개수 / 2
- 첫째 수 = 1
- 마지막 수 = k-1
- 개수 = (k-1)
1 + 2 + 3 + ... + (k-1) = (1 + (k-1)) * (k-1) / 2
= k * (k-1) / 2
(k-1)*k/2
연속된 k개의 숫자를 더하면
x + (x+1) + ... + (x+k-1) = n
공식으로 바꾸면:
k*x + k*(k-1)/2 = n
x를 구하면:
x = (n - k*(k-1)/2) / k
여기서 k가 연속된 숫자의 개수이고 구한 x가 시작점
* ****
** ***
*** **
**** *
삼각형 두개 더하고 나누는 원리랑 같음
투포인터
class Solution {
public int solution(int n) {
int count = 0;
int left = 1, right = 1, sum = 1;
while (left <= n) {
if (sum < n) {
right++;
sum += right;
} else if (sum > n) {
sum -= left;
left++;
} else { // sum == n
count++;
sum -= left;
left++;
}
}
return count;
}
}