본문 바로가기
Algorithm/BOJ

[백준] 1292번 쉽게 푸는 문제 자바

by YOONAYEON 2022. 4. 25.
문제

 

 

1292번: 쉽게 푸는 문제

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

www.acmicpc.net

 

 

문제 풀이

 

처음에는 반복문으로 B까지의 배열을 생성해서 그냥 더해야 하나 싶었는데 뭔가 비효율적인 것 같아서 인덱스를 이용해서 풀었다.

아래와 같이 1+2+3.. 이런식으로 더해나갈 때 그 수의 마지막 인덱스 번호가 되는 것을 이용했다.

인덱스 구간 안에 A와 B가 포함될 때, 해당 숫자 값을 곱해서 answer변수에 넣어줬다.

해당 숫자 구간 안에 들어왔으면 그때의 더해진 인덱스(해당 숫자의 마지막 인덱스 번호)에서 A값을 빼면 해당 숫자를 몇 개 더해야 하는지 알 수 있다.

이때, A,B가 같은 숫자 구간에 있는 경우는 따로 처리해주어야 된다. (A,B각각 처리되어서 오류났었음)

 

 

소스 코드

 

public class b_1292 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		sc.close();

		boolean flag = false;
		int idx = 0, answer = 0;
		
		for(int i = 1; i <= B; i++) {
			idx += i;
			
			if(idx >= B && flag) {
				// (idx - i + 1) : i숫자의 시작 인덱스
				answer += (B - (idx - i + 1) + 1) * i;
				break;
			}
			
			if(flag) 
				answer += i * i;
			
			if(idx >= A && !flag) {
				answer += (idx - A + 1) * i;
				flag = true;
				if(idx >= B) {	//같은 i구간 내에 있는 경우 처리
					answer = (B - A + 1) * i;
					break;
				}
			}
		
		}
		
		System.out.println(answer);		
	}

}