티스토리 뷰

 

https://www.acmicpc.net/problem/2018

 

2018번: 수들의 합 5

어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한

www.acmicpc.net


시작인덱스와 종료인덱스 두 포인터 크기를 조정해가면서 수들의 합을 만족하는 경우를 찾는 문제이다.

연속된 자연수 중 가장 작은 수가 시작, 가장 큰 수가 종료이다.

맨 처음에는 시작, 종료 모두 1에서 시작하게 되므로 연속된 수의 합은 1이다.

합이 목표 숫자인 N보다 작으면 종료 포인터를 우측으로 옮겨(= 종료포인터의 크기가 +1된다.) 연속된 수의 합을 늘려주고

합이 목표 숫자인 N보다 크면 시작 포인터를 우측으로 옮겨(=시작포인터의 크기가 +1 된다.) 연속된 수의 합을 줄여준다.

import java.io.*;


public class Main {

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        int start = 1, end = 1, sum = 1, count = 0;
        while(true) {
            if(end == N && start == end){
                count++;
                break;
            }
            if (sum > N) {
                sum -= start;
                start++;
            }
            else if (sum < N) {
                end++;
                sum += end;
            }
            else if (sum == N) {
                count++;
                end++;
                sum += end;
            }
        }
        bw.write(""+count);
        br.close();
        bw.flush();
        bw.close();
    }
}

반복문 조건을 end != N으로 놓고

count를 0이 아닌 1로 시작하는 방법도 있다.

import java.io.*;


public class Main {

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        int start = 1, end = 1, sum = 1, count = 1;
        while(end != N) {
            if (sum > N) {
                sum -= start;
                start++;
            }
            else if (sum < N) {
                end++;
                sum += end;
            }
            else if (sum == N) {
                count++;
                end++;
                sum += end;
            }
        }
        bw.write(""+count);
        br.close();
        bw.flush();
        bw.close();
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함