tony1803   5년 전

한 막대의 길이 최대값이 100이고 자르고자 하는 막대 최대 개수가 500000이면 막대의 최대 길이가 5천만인데 왜 int형 데이터 범위에 걸리나요??? 확인 부탁드립니다.

ho94949   5년 전

코드를 봤는데, 코드에서는 오버플로우가 일어날 수 있네요. 막대의 최대 갯수가 500000이니, 최대 길이는 5천만이고, 5천만 * 막대의 길이 100 을 하면 50억이 나오기 때문에 32bit int로는 오버플로우가 발생할 수 있습니다.

그와 별개로 데이터에 문제가 있는것은 맞네요. assert 를 걸었을 때 런타임 에러가 나오네요. 1<=ai<=100 범위를 벗어나는 입력이 있는것 같습니다

tony1803   5년 전

답변 감사합니다. 그래서 출력값은 long long으로 처리해줬습니다. 다만 저 최대 길이 값을 받아오는 과정에서도 범위를 벗어나는 입력이 있는 것 같아서 질문했습니다. 감사합니다.

startlink   5년 전

수정했습니다.

tony1803   5년 전

아니요 막대 최대 길이가 5천만인데 int로 처리하면 에러나서 질문드린 겁니다. 101까지라고 해서 문제가 해결될 것 같진않은데요.

startlink   5년 전

무슨 말인지 모르겠습니다.

입력 데이터는 문제의 범위를 모두 만족합니다.

tony1803   5년 전

현재 문제에 주어진 막대 최대 길이가 101이고 막대 최대 개수가 500000개면 막대의 총 길이의 최대는 5천5십만인데 이는 int형 범위 안에 들어갑니다. 그런데 이를 int로 처리하면 답이 틀렸다고 나오고 long long으로 바꿔줘야 정답처리가 됩니다.

startlink   5년 전

네 제출하신 소스 보면, 그 값이 변수에 들어가는 최대값이 아닌 것 같습니다. 제가 볼 때는 대략 500000*101*101 정도가 변수에 들어가는 최대값이 되겠네요.

tony1803   5년 전

네?? 그러니까 문제가 잘못된거아닌가요???

startlink   5년 전

원래 문제의 제한이 a[i] ≤ 100 이었는데, 데이터를 확인해보니 a[i] ≤ 101이 맞았습니다.

그 외에는 잘못된 점이 전혀 없습니다. 

제출하신 코드 살펴보면, 연산 과정 중에 int 범위를 넘어갈 수 있는 곳이 있습니다.

startlink   5년 전

문제가 잘못되었다는게 무엇을 의미하는 것인지 모르겠습니다.

막대의 최대 길이가 5천만인 것과 n개의 쇠막대를 얻는 최소의 비용이 무슨 관계가 있는지 잘 모르겠습니다.

tony1803   5년 전

그 최소 비용을 구하기 위해서 막대의  총 길이를 먼저 구해야 하잖아요. 그 때 이제 저 같은 경우에는 막대의 길이를 barAdd라는 변수에 저장했는데요 왜 이 변수를 int로 선언했을 때 오답으로 처리되는가가 제 의문입니다. 말씀하신대로 막대의 최대 길이는 5천5십만인데 말이죠...

startlink   5년 전

코드를 그렇게 구현하셨으니깐요. 막대의 총 길이에 막대의 길이를 곱했으니깐 int를 넘어가죠

tony1803   5년 전

그건 막대 자르는 비용 구할 때 곱한거구요 제 최근 코드 보시면 barAdd라는 변수에다가는 그냥 막대의 총 길이만 더해서 저장합니다... 그런데 int barAdd;라고 선언하면 에러가 나구요.

startlink   5년 전

23-25번 줄에서 barAdd에 막대 길이의 합을 저장하니까 최대 50,500,000이 저장되겠죠

31번줄에서 barLen[j] * barAdd를 하니까 101 * 50,500,000을 해서 int를 넘어갈 수 있겠죠.

tony1803   5년 전

아아 연산해서 다른 변수에 더하는 데도 barAdd 크기에 영향을 주는군요. 아 알겠습니다 감사합니다.

댓글을 작성하려면 로그인해야 합니다.