강의로 돌아가기
steeringhead

형변환에 대해 궁금한 것이 있습니다.

times벡터는 int형이고 n역시 int형인 상태에서,
maxTime을 long long으로 선언해주면 n*times[0]에서의 오버플로우를 막을 수 있는게 아닌가요?

long long maxTime = n*(long long)times[0];
여기서 long long으로의 명시적 형변환을 제거하면 답이 틀리는 테케가 발생합니다.. 왜 그런지 이해가 가질 않네요
제가 어떤 부분에서 잘못 알고 있는지 설명해주시면 정말 감사하겠습니다.

작성중인 코드―solution.cpp
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
#include <string>
#include <vector>
#include <algorithm>

using namespace std;


//이 문제를 어떻게 이분 탐색으로 푸냐 ?
//-> 최대시간을 기준으로 이분 탐색을 통해 그 시간에 몇명을 처리할 수 있는지를 따라가는 풀이방법!

bool cmp(long long a,long long b)
{
    return a > b;
}

long long solution(int n, vector<int> times) {
    long long answer = 0;    
    sort(times.begin(),times.end(),cmp);

    long long maxTime = n*(long long)times[0];
    long long left = 1;
    long long right = maxTime;

    while(left<=right)
    {

        long long mid = (left+right) / 2;
        long long cnt = 0;

        for (int i=0;i<times.size();i++)
        {
            cnt += (mid/(long long)times[i]);
        }

        if (cnt < n)
        {
            left = mid+1;
        }
        else
        {
            right = mid-1;
            answer = mid;
        }

    }

    return answer;
}
1 개의 답변
심우진

1-1. long long = int * int;
1-2. long long = int; -> 오버플로우 발생 가능성 있음, int * int의 값은 int이고 이 값이 long long에 대입되는 순간 형변환 되는 것

2-1. long long = long long * int;
2-2. long long = long long; -> 문제 없음(이렇게 해서 맞추신거고 C++언어 규칙 상 산술 연산 시 더 포괄적인 타입에 맞게 됩니다)

3-1. long long = long long * long long;
3-2. long long = long long; -> 당연히 문제 없음

  • steeringhead

    오우 감사합니다!

    steeringhead―2024.01.03 16:21
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.