[Baekjoon] 1292번: 쉽게 푸는 문제 - Java

2021. 12. 10. 18:55Computer Sciences/Problem Solve

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

 

1292번: 쉽게 푸는 문제

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.

www.acmicpc.net

문제 설명

문제 그대로 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ... 로 이루어진 수열에서 입력받은 숫자 사이의 구간의 합을 구하면 된다.

최대 인덱스가 1000이므로 ArrayList로 숫자를 미리 저장해둔 뒤 해당 구간에 해당하는 숫자들을 읽어서 더하는 식으로 간단하게 풀었다(문제 이름 그대로).

문제 풀이

import java.io.*;
import java.util.*;

public class Main {

    private static ArrayList<Integer> nums = new ArrayList<>(1010);

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

        int idx = 0;
        loop:
        for (int i = 1; i <= 1000; i++) {
            for (int j = 0; j < i; j++, idx++) {
                if (idx >= 1001) break loop;
                nums.add(i);
            }
        }

        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {

            String line = br.readLine();
            String[] token = line.split(" ");

            int start = Integer.parseInt(token[0]);
            int end = Integer.parseInt(token[1]);
            int result = 0;

            for (int i = start - 1; i < end; i++) {
                result += nums.get(i);
            }
            System.out.println(result);
        }
    }
}

참고

ArrayList의 기본 크기는 10이다. 우리가 저장할 값은 1000번째까지인데 기본값으로 생성하면 공간이 필요할 때마다 내부적으로 배열의 크기를 두 배로 확장하는 작업을 계속 하게 된다. 따라서 1000 이상의 넉넉한 값으로 초기화한 후 사용하는 편이 성능상 이득이다.