ezhoon

[인프런] 03_05 연속된 자연수의 합 (Two pointer) 본문

[Java] 인프런 문제풀이/Two pointers, Sliding window

[인프런] 03_05 연속된 자연수의 합 (Two pointer)

ezhoon 2022. 1. 21. 23:56

📖  문제


  • 첫 번째 줄에 양의 정수 N가 주어진다.
  • 2개 이상의 연속된 자연수의 합으로 정수 N을 표현하는 방법의 가짓수를 출력
    • N이 15이면
    • 7 + 8 = 15 / 4 + 5 +6 = 15 / 1 + 2 + 3 + 4 + 5 = 15 총 3가지의 경우가 존재한다.

출력

 

⚠️  주의사항


 

 

✍️  이해


* 1. 정수 N 만큼의 배열 생성 15면 1 ~ 14까지의 배열 arr 생성
* 2. pointer) left, right = 0
* 3. right 값이 N - 2 될 때 까지 반복
*  3-1. sum < N -> sum += arr[++right]
*  3-2. sum > N -> sum -= arr[left++]
*  3-3. sum = N -> sum -= arr[left++], answer ++;
* 4. sum == N -> answer ++

 

✏️  풀이


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Java03_05 {

    public int solution(int N, int[] arr) {

        int answer = 0;
        int left = 0, right = 0;
        int sum = arr[left];

        while (right < N - 2) {

            if (sum < N) {
                sum += arr[++right];
            } else if (sum > N) {
                sum -= arr[left++];
            }else{
                sum -= arr[left++];
                answer++;
            }
        }
        if (sum == N) {
            answer++;
        }

        return answer;
    }

    public static void main(String[] args) throws IOException {

        Java03_05 T = new Java03_05();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int[] temp = new int[N - 1];
        for (int i = 0; i < N - 1; i++) {

            temp[i] = i + 1;
        }
        System.out.println(T.solution(N,temp));
    }
}

 

Comments