Skip to main content

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;
    }
}