728x90

 0. [c++] 백준  - 


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


 1. 풀이


1) 뭐, 이번 문제는 문제의 조건을 생각의 흐름대로 코딩하여 만들어보았다.

   설명은 아래 코드에 포함시켰으므로 읽어보면 이해가 갈 것이라고 생각된다.



2) count를 i로 나눠주는 것이 얼마나 효율적인 것이였는지 보여주기 위해서 코드를 올려놓았다.

저 코드와 1)번 코드는 꽤 큰 차이가 난다.

이 위에것이 2번, 아래가 1번 코드인데, 이러한 시간 차이가 발생하게 된다.




 2. 소스코드

1) 처음 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<iostream>
 
int N, L;
 
void calc() {
    int count, sum(0), i(L-1), flag(0);
    while (sum != N) {
        sum = 0;
        //괜한 연산을 줄이기 위해 count는 N/i부터 시작한다.
        //길이는 L부터 시작하여 1씩 증가하도록 하였다.
        count = N / ++i;
        
        //이번에 구할 길이가 100을 초과한다면 flag를 세우고 탈출!
        if (i > 100) {
            flag = 1;
            break;
        }
 
        //N/i로 나누어 값을 준 것은 찾아야 할 값의 평균 값에 불과하다.
        //우리는 count++한 값을 지속적으로 더할 것이므로, 대략 (평균 값) - (길이/2)이 되어야한다.
        //허나 따로 구현하기 귀찮으므로, i=100인 것을 기준으로 50을 빼버렸다.
        count -= 50;
        
        //음이 아닌 정수 리스트여야 하므로 0보다 작은 경우는 0부터 시작하도록 하였다.
        if (count < 0)
            count = 0;
 
        //리스트에 수를 넣어주자.
        for (int t = 0; t < i; t++) {
            sum += count++;
        }
 
        //sum < N인 경우 리스트 전체에 1씩 더해준다.(결과적으로 sum += i가 된다.)
        //이때, count가 가리키는 숫자는 리스트의 마지막 숫자이다.
        while (sum < N) {
            sum += i;
            count++;
        }
    }
 
    if (flag) {
        std::cout << "-1";
    }
    else
        //이건 뭐, 그냥 출력이다.
        for (i; i > 0; i--)
            std::cout << count - i << " ";
}
 
int main() {
    std::cin >> N >> L;
    calc();
}
cs




2) count에서 시작하는 곳을 따로 지정하지 않을 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
 
int N, L;
 
void calc() {
    int count, sum(0), i(L-1), flag(0);
    while (sum != N) {
        sum = 0;
        //여기서는 count를 0에서 부터 시작한다.
        count = 0;
        i++;
        if (i > 100) {
            flag = 1;
            break;
        }
        for (int t = 0; t < i; t++) {
            sum += count++;
        }
        while (sum < N) {
            sum += i;
            count++;
        }
    }
    if (flag) {
        std::cout << "-1";
    }
    else
        for (i; i > 0; i--)
            std::cout << count - i << " ";
}
 
int main() {
    std::cin >> N >> L;
    calc();
}
cs


 3. 참고





질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!


+ Recent posts