본문 바로가기

Baekjoon(C++)

[C++]백준 알고리즘 13458번

풀이는 아래와 같다.

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
#include <iostream>
// #include <cmath>
 
using namespace std;
 
int a[1000000];
 
int main(){
    
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int n;
    // int* a = new int[n];
    int b, c;
    
    cin >> n;
    forint i=0; i<n; i++){
        cin >> a[i];
    }
    cin >> b >> c;
    
    // int sum = 0;
    long long sum = 0;
    
    forint i=0; i<n; i++){
        if(b >= a[i]){
            sum += (long long)1;
        // }else if (b + c >= a[i]){
        //     sum += 2;
        }else{
            // sum += ceil((float)(a[i]-b)/c) + 1;
            
            if( (a[i]-b)%c == 0){
                sum += (long long)((a[i]-b)/+ 1);
            }else{
                sum += (long long)((a[i]-b)/+ 2);
            }
        }
    }
    
    cout << sum << '\n';
    // delete[] a;
    return 0;
    
}
cs

시행착오:

처음에는 알고리즘이 틀린줄 알고, 혹은 a의 배열이 동적할당을 하면 안되나(?) 싶어서 주석 처리를 하고 전역 변수로 a를 int형 배열로 선언해주었는데, 그게 문제가 아니었던 것 같다. 메모리가 스택 영역에 생성되는 건 함수 내에서 그냥 선언되어 사용하는 배열의 경우인데, 이게 너무 크면 문제가 되지만 동적할당한 경우에는 괜찮은 것 같다. 근데 또 동적할당할때는 runtime error(Segfault)가 뜨더니 전역변수로 선언하니까 틀렸습니다! 라고 떠서 그 차이가 왜 생기는지는 나중에 알아봐야겠다. 그리구 아래는 검색하다가 알게 된 내용이지만 앞으로도 참고하면 좋겠다.

 

"배열의 크기가 꽤 큰 것 같은 생각이 든다면 함수 내에서 선언하는 것보다 전역 변수로 선언하여 스태틱 영역을 사용하거나 동적 할당을 하여 힙 영역의 메모리를 이용하자."

 

암튼 위와 같은 가르침을 얻긴 했지만 그게 문제가 아니었다. 문제는 바로 sum의 자료형에 있었다.

처음에 int형으로 선언했는데, 도저히 왜 틀렸는지 알수가 없어서 찾아보는 과정에서 충격적이게도

long long 이라는 자료형이 있음을 발견했다. 왜 나는 아직까지 몰랐던 건지..? PS가 처음이라 그런지 이전에 수업을 들을때는 필요없었던 자료형을 검색하다 알게 되었다. 사실 별건 아니고 64비트 머신의 long형이 8byte라 그걸 이르는 자료형인거 같긴 한데 나중에 주말에 시간 많을때 더 알아봐야겠다. 그냥 long은 컴퓨터가 32비트인지 64비트인지 여부에 따라 4byte, 8byte로 달라지는 걸로 알고 있는데 long long 은 __int64 같은 느낌인거 같다. 암튼 이 sum의 자료형을 바꾸어 주니 성공했다...! 감독관의 총 수로 가능한 최댓값이 백만 곱하기 백만임을 감안하면 이 생각을 할만도 한 것 같다. 문제가 어쩐지 너무 간단하더라니 역시 알고리즘 문제를 풀 때는 큰 수를 다루는 것이 점점 익숙해져야겠다는 생각이 든다. 오늘도 겸손해지는 하루인 것 같다... 더 열심히 해보자 빠팅!

반응형

'Baekjoon(C++)' 카테고리의 다른 글

[C++]백준 알고리즘 8393번  (0) 2021.07.03
[C++]백준 알고리즘 10950번  (0) 2021.07.03
[C++]백준 알고리즘 2839번  (0) 2021.07.01
[C++]백준 알고리즘 15719번  (0) 2021.06.28
[C++]백준 알고리즘 1269번  (0) 2021.06.27