[알고리즘] 2018번

._mung·2024년 2월 6일
0

Algorithm

목록 보기
14/56

오늘 풀어볼 문제는 백준 2018번 문제 "수들의 합 5" 이다.

이 문제는 실버5 문제이고 투 포인트 문제이다.

문제

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

예를 들어, 15를 나타내는 방법은 15, 7+8, 4+5+6, 1+2+3+4+5의 4가지가 있다. 
반면에 10을 나타내는 방법은 10, 1+2+3+4의 2가지가 있다.

N을 입력받아 가지수를 출력하는 프로그램을 작성하시오.

입력

첫 줄에 정수 N이 주어진다.

출력

입력된 자연수 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 출력하시오.

📌첫 번째 도전📌

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());

        int N = Integer.parseInt(stringTokenizer.nextToken());
        int count = 1; // N 일 때를 미리 카운트하고 시작
        long sum = 1;
        long start_index = 1;
        long end_index = 1;

        while(end_index != N) {
            if (sum == N) {
                count++;
                end_index++;
                sum = sum + end_index;
            }
            else if (sum > N) {
                sum = sum - start_index;
                start_index++;
            }
            else {
                end_index++;
                sum = sum + end_index;
            }
        }
        System.out.println(count);
    }
}

문제 자체는 어렵지 않았는데, 초반 시간을 소비한 부분이 문제를 제대로 읽지 않아서다 ㅎㅎ
연속된 수라는 말을 못 보고 그냥 N만 맞춰서 출력하면 되는 줄 알고 이상한 방향으로 가고 있었다..

앞으로 문제를 좀 잘 읽어야겠다.

위 코드에서 가장 중요 시 할 부분은 일단 첫 번째는 투 포인트를 이용한 점이다.
두 개의 인덱스 포인트를 이용해서 시작과 끝지점을 계속 바꿔나가며 합을 구했다.
두 번째는 3가지 조건문이다.
sum > N : sum = sum - start_index; start_index;
sum < N : end_index; sum = sum + end_index;
sum == N : end_index; sum = sum + end_index; count++;

위 조건문 3가지를 이용해서 연속된 수들 사이에서 N 값을 찾아나갔다.

[문제 출처] https://www.acmicpc.net/problem/2018

profile
💻 💻 💻

0개의 댓글

관련 채용 정보