문제를 풀다가 만난 1LL에 대하여.

문제를 풀다가 long long 타입으로 만든 ans라는 변수에 새로운 값을 대입할때 처음 보는 코드를 보게되어서 검색해보았다. 

while (!S.empty() && S.top().X >= h)
            {
                // 스택의 top에 있는 막대 높이가 현재 높이보다 크거나 같으면
                // 스택의 top에 있는 막대로부터 최대 넓이를 계산하고 갱신
                ans = max(ans, 1LL * (i - S.top().Y) * S.top().X);
                idx = S.top().Y; // 현재 인덱스를 스택의 top에 있는 막대의 인덱스로 갱신
                S.pop();         // 스택에서 top에 있는 막대를 제거
            }
            S.push({h, idx}); // 현재 막대를 스택에 추가하고 인덱스를 저장

이러한 내용이었고, 이 부분중에서 

ans = max(ans, 1LL * (i - S.top().Y) * S.top().X);

이 중에서도 1LL* 바로 이곳이다. 

1LL을 곱해주겠다고 하는데, 코드에서 발견한 주석의 내용에 의하면 이 과정이 의미하는바가, 

long long으로의 형변환을 편하게 처리하기 위해 1LL을 매번 곱했고, 그냥 스택
자체를 pair<long long, long long>으로 선언해도 크게 상관 없다.

라고 하는데, 아마 stack<pair<int,int>> S; 로 선언해놓은 스택 때문에, ans는 longlong 이니까 1LL을 곱해주어서 계속해서 ans를 새롭게 대입할때마다 형변환을 편하게 처리하겠다는 의미같은데, 1LL이 정확히 어떤 의미인지 궁금해서 gpt에 검색해보았다. 

 

위와 같은 내용을 얻을 수 있었고, 주석으로 정보전다를 하는 부분과 함께 보았을때, 무슨 맥락으로 1LL을 사용하였는지 이해할 수 있는부분이었다. 

현재 내 수준에서는 애초부터 pair<long long, long long>으로 처리할것 같은데, 이러한 코드를 따라해보며

이런식의 표현법에 익숙해져 보도록 하자. 

 

++

리터럴 상수 라는 얘기가 어떤 의미인지 정확히 알고싶어서 검색한 내용을 첨부해보면, 

 

 

 

 

위와 같은 정보들을 얻을 수 있었다. 

참고하도록 하자. 

 

 

그리고 결국 위와같이 1LL을 곱하는 연산을 하는 이유가, 마지막에 롱롱타입으로 편하면서도 확실하게 바꾸기 위함이라고 판단하여서 c++ gcc 상에서 longlong과 int의 연산에서 데이터의 반환타입에 대해서 검색해보니 얻은 정보를 첨부한다. 

결국 확실하게 longlong을 반환받고 그렇게 편하게 바꾸기 위해서 1LL을 중간에 곱해준것으로 보인다. 

이 표현에 익숙해진다면 int를 사용하다가 필요한 부분에 1LL을 곱해서 확실하게 long long으로 반환받을 수 있을것 같다. 

기억해보고 사용해보도록 하자. 

 

  Comments,     Trackbacks