본문 바로가기

알고리즘/문제 풀이

[백준] 2018 수들의 합 5 Java 풀이

1. 문제 설명

[문제 링크](https://www.acmicpc.net/problem/2018)

2. 접근 방식

투포인터 문제

  1. 투 포인터 구간 안에 합을 변수 acc에 저장한다.
  2. acc <= N이 안되면 오른쪽 포인터를 한 칸 움직여서 그 값을 acc에 더한다.
  3. acc > N 이면 왼쪽 포인터를 한 칸 움직여서 그 값을 acc에 더한다.
  4. 이렇게 오른쪽 포인터가 구간의 맨 끝에 도달할 때까지 반복하며 acc == N 인 경우를 센다.

3. 코드 분석

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int cnt = 0, start = 0, end = 0, acc = 0;

         while (end <= N){

             if(acc < N){
                 end++;
                 acc += end;
             }else {
                 if (acc == N){
                     cnt++;
                     end++;
                     acc += end;
                 }else {
                     start++;
                     acc -= start;
                 }
             }
         }

        System.out.println(cnt);
    }
}

4. 성장하기

투포인터 문제에서 내 취약점은 범위 산정이다.

  1. 포인터를 한 칸 앞으로 진행 시킨다.
  1. 포인터 사이의 합이 N이 되는지 확인한다.

이 두 가지 계산의 순서에 따라서 while문의 범위가 달라진다. (① -> ②) 로 할 경우, 위와 같이 while문의 범위를 <=N 까지만 하면 된다. 반면 (② -> ①) N이 더해지는 시점은 end = N+1인 시점이다. 따라서 마지막 N까지 더하려면 while문의 범위가 N+1까지여야 한다.

// 예시 코드 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int cnt = 0;
        int start = 0;
        int end = 0;
        int acc = 0;

         while (end <= N+1){

             if(acc < N){
                 acc += end;
                 end++;
             }else {
                 if (acc == N){
                     cnt++;
                     acc += end;
                     end++;
                 }else {
                     acc -= start;
                     start++;
                 }
             }
         }

        System.out.println(cnt);
    }
}