본문 바로가기
Algorythms

백준 1392번 노래악보 c++ 풀이

by 준형코딩 2024. 4. 28.

문제

현수는 학생들에게 노래를 가르치고 있다. 총 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번 질문까지 해당 시간(초)에 부르는 악보의 번호를 출력한다.

예제 입력 1 복사

3 5
2
1
3
2
3
4
0
1

예제 출력 1 복사

2
3
3
1
1

 

 

간단한 구현 문제이다. 복잡하게 생각해서 조금 오래 걸렸다.

question을 입력받을 때마다 악보의 누적합에서 -1을 한 값과 동일하거나 더 적다면 현재 위치를 반환하고 출력한다.

 

 

#include <bits/stdc++.h>

using namespace std;

int n, q;
int musicalScores[101];

int findCurrentMusicalScore(int question) {
    for (int i = 0; i < n; i++) {
        if (question <= musicalScores[i] - 1) {
            return i + 1;
        }
    }
    return n;
}

int main() {

    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> q;

    cin >> musicalScores[0];

    for (int i = 1; i < n; i++) {
        int musicalScore;
        cin >> musicalScore;
        musicalScores[i] = musicalScore + musicalScores[i - 1];
    }


    for (int i = 0; i < q; i++) {
        int question;
        cin >> question;
        cout << findCurrentMusicalScore(question) << "\n";
    }

}