수열의 합

문제 링크: https://www.acmicpc.net/problem/1024

 

1024번: 수열의 합

첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

www.acmicpc.net

문제를 읽고 N과 M의 연관성을 찾게 되었다.
N을 M으로 나누고 그 근방의 리스트의 합이 N과 유사한 값을 내고 있음을 찾았다.

따라서, 먼저 손으로 20부터 23까지의 4개의 수 리스트를 한번 작성해 보았다.

예제

N
M -> N/M
List : Sum

20
3 -> 6
5 6 7 : 18
4 -> 5
4 5 6 7 : 22
5 -> 4
3 4 5 6 7 : 25
6 -> 3
1 2 3 4 5 6 : 21

21
2 -> 10
10 11 : 21
3 -> 7
6 7 8 : 21
4 -> 5
4 5 6 7 : 22
5 -> 4
2 3 4 5 6 : 20
6 -> 3
1 2 3 4 5 6 : 21

22
2 -> 11
11 12 : 23
3 -> 7
6 7 8 : 21
4 -> 5
4 5 6 7 : 22
5 -> 4
3 4 5 6 7 : 25
6 -> 3
1 2 3 4 5 6 : 21

23
2 -> 11
11 12 : 23
3 -> 7
6 7 8 : 21
4 -> 5
4 5 6 7 : 22
5 -> 4
2 3 4 5 6 : 20
6 -> 3
1 2 3 4 5 6 : 21

M이 주어지면 해당 값부터 1씩 증가시켜 리스트의 합과 N을 비교한다.

음이 아닌 정수의 리스트이므로 첫 시작점이 음수일 경우는 아무런 작업을 하지 않고 다음 단계인 M+1의 작업을 수행한다.

정답코드

#include<iostream>
using namespace std;

int sumList(int n, int m_) {
    int m = m_; //idx

    while (m<=100) {
        int sum = 0;
        int half;

        if (m % 2)
            half = m / 2;
        else
            half = (m- 1) / 2;

        int mid = n / m;
        int start = mid - half;


        if (start >= 0)
            for (int i = 0; i < m; i++)
                sum += (start + i);

        if (sum == n)
            return m;
        m++;
    }
    return -1;
}

void print(int n, int idx) {
    int half;

    if (idx % 2) 
        half = idx / 2;
    else
        half = (idx - 1) / 2;

    int mid = n / idx;
    int start = mid - half;

    for (int i = 0; i < idx; i++)
        cout << (start + i) << " ";
}

int main() {
    int n, m;
    cin >> n >> m;

    int idx = sumList(n, m);

    if (idx == -1)
        cout << -1 << endl;
    else
        print(n, idx);

    return 0;
}

'ProblemSolving' 카테고리의 다른 글

[BOJ] 1012_유기농 배추  (0) 2021.01.24
[BOJ] 1105_팔  (0) 2021.01.23
[BOJ] 1003_피보나치 함수  (0) 2021.01.21
[BOJ] 1026_보물  (0) 2021.01.20
[BOJ] 1021_회전하는 큐  (0) 2021.01.19
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기