aqazx9   2년 전

반례도 찾아가면서 해봤는데 콘솔에서는 다 맞다고 나오는데 틀립니다 ㅠㅠ 이유 알 수 있을까요?

wizardrabbit   2년 전

안녕하세요? 올려주신 코드로 디버깅을 해 보았습니다. 먼저 반례입니다:

입력 : 1 1 2100000000
정답 : 1
출력 : 5

이러한 반례가 발생하게 된 이유는 바로 11번째 줄의 'parseInt' 에 있습니다!

질문자님께서는 손익분기점을 계산한 후 값을 버림하여 정수로 나타내기 위해 parseInt를 사용하신 것으로 보입니다. 하지만, parseInt는 본래 수를 버림한 값을 계산하기 위한 용도보다는 문자열을 정수로 변환하기 위한 용도로 사용합니다.

https://www.acmicpc.net/board/... 에 제가 다른 질문자님께 답변을 해드릴 때 값을 버림하기 위한 용도로 추천한 함수는 Math.floor() 입니다. Math.floor()는 인자로 들어간 값을 버림하여 정수 형태로 반환합니다. 만약 버림이 아닌 반올림과 올림을 원하실 경우 각각 Math.round() 와 Math.ceil() 을 사용하실 수 있습니다.

여기서 Math.floor() 를 사용하나 parseInt() 를 사용하나 버림한 값을 출력해 줄텐데 굳이 왜 Math.floor() 를 추천하는지, 둘 다 값을 버림했는데 왜 저런 반례가 생길지 의문이 드실 겁니다. 반례가 생기는 이유는, 바로 두 함수의 동작 방식이 달라서입니다.

앞서 말씀드렸다시피, parseInt()는 문자열을 정수로 변환(추출)하기 위한 용도로 사용합니다. 그렇기 때문에 parseInt()는 수를 버림하는 로직과는 작동 방식이 다릅니다.

parseInt에 들어간 입력값은 숫자 부분이 추출된 상태가 결과값으로 나옵니다.

● '123abc' 같이 숫자 뒤에 문자열이 섞인 값이 입력값으로 들어오면 123이 추출되어 123이 반환됩니다(NaN이 반환되지 않습니다).

● 1234.5678 같은 소수가 입력값으로 들어오면 '.' 이전의 정수 부분이 추출되어 1234가 반환됩니다(버림 효과를 냅니다).

이런 식으로 parseInt()는 정수를 추출하는 방법을 사용하기 때문에, 이 경우 의도와 다른 결과가 나올 수 있습니다.

● -1234.5678 이 입력값으로 주어질 경우 '.' 이전의 정수 부분인 -1234가 추출되어 -1234가 반환됩니다. 결과적으로 버림이 아닌 올림한 효과와 같습니다.

● 0.00000000000003 같은 자릿수가 너무 높은 값이 입력값으로 주어질 경우 의도했던 0과 달리 3이 반환됩니다. 왜냐하면 위 수는 실제로 3e-14(3에 10의 -14승을 곱한 값) 로 간주되고, 그에 따라 맨 앞의 정수값인 '3' 이 추출되기 때문입니다. (틀린 이유)

이러한 문제점이 있기 때문에 값을 버림/올림/반올림 하는 등의 연산을 하고 싶으신 경우에는 parseInt() 를 추천하지 않습니다.

값을 버림하기 위한 용도일 경우에는 Math.floor() 를 사용해 주시고, 문자열을 정수로 변환하고 싶을 때는 parseInt() 를 적극 사용해 주세요!

aqazx9   2년 전

감사드립니다!! parseInt()대신 Math.floor()사용하니 바로 되네요. 앞으로 정수추출은 Math.floor()만 사용하겠습니다 감사합니다

wnsh27   2년 전

헐 저도 parseInt 로 했다가 정보 얻고갑니다 감사합니다!!

khj7741   1년 전

와 저도 parseint를 버림을 위한 용도로 사용했었는데 이런 차이가 있는 줄 몰랐네요 잘 배워갑니다 정말 감사합니다~!

wizardrabbit   1년 전

*정수를 문자열로 변환하고 싶을 때는 parseInt() 를 적극 사용해 주세요!

-> 문자열을 정수로 변환하고 싶을 때는 parseInt()를 적극 사용해 주세요!

오타 있어서 정정하겠습니다.

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