본문 바로가기

백준/C++

[Baekjoon/C++] 1392번 - 노래 악보

Baekjoon Online Judge

문제로 이동

 

문제

현수는 학생들에게 노래를 가르치고 있다. 총 N개의 악보가 있고 i번째 악보는 Bi초로 이루어져 있다. 학생들은 0초부터 1번 악보를 따라 노래하기 시작했다. 즉 B1-1초에 1번 악보를 끝마치게 되고 B1초부터 B1+B2-1초까지 2번 악보를 따라 부르게 된다.

악보 1 1 2 3 3 3
시간 0 1 2 3 4 5

문제는 T1부터 TQ까지 Q개의 시간에 대해 대답을 하는 것인데, Ti초 때 노래하는 악보를 i번째에 출력하는 것이다.

 

입력

첫 줄에는 악보 수 N(1 ≤ N ≤ 100)과 질문의 개수 Q(1 ≤ Q ≤ 1,000)가 주어진다. 다음 N개의 줄에는 1번 악보부터 N번 악보까지 각 악보가 차지하는 시간(초)이 한 줄에 하나씩 주어진다. 각 악보가 차지하는 시간은 100 이하의 정수이다. 다음 Q개의 줄에는 알고자 하는 Q개의 시간(초)이 한 줄에 하나씩 주어진다. 묻는 시간 역시 정수만 주어진다.

 

출력

Q개에 줄에 1번 질문부터 Q번 질문까지 해당 시간(초)에 부르는 악보의 번호를 출력한다.

 


예제 입력 예제 출력
3 5
2
1
3
2
3
4
0
1
2
3
3
1
1

풀이

#include <iostream>
using namespace std;

int main() {
	// 악보의 수 N, 질문의 개수 Q
	int N, Q;
	cin >> N >> Q;

	// 각 악보가 끝나는 시간
	int* time = new int[N];

	// 각 악보가 끝나는 시간구하기
	for (int i = 0; i < N; i++) {
		int n;
		scanf("%d", &n);

		if (i == 0)
			time[i] = n - 1;
		else
			time[i] = time[i - 1] + n;
	}

	// 해당 시간에 부르는 악보 번호 찾기
	for (int i = 0; i < Q; i++) {
		int q;
		scanf("%d", &q);

		for (int j = 0; j < N; j++) {
			if (q <= time[j]) {
				printf("%d\n", j + 1);
				break;
			}
		}
	}

	return 0;
}

time[]에 각 악보가 끝나는 시간을 구해서 저장한 뒤 입력되는 q가 포함되는 범위를 가진 인덱스를 찾아서 출력했다.