gallopsys   7년 전

간단한 기하문제라고 생각해서 도전했는데, 큰 낭패를 보고 있네요 ㅠㅠ 어디가 문제인지 잘 모르겠습니다...


평행사변형을 만들 수 있는 경우와 없는 경우를 계산하여, 둘레를 계산해서 그걸 결과값으로 내놓은 건데...

처음부터 제가 생각을 잘못한 거라 생각하고 다시 도전을 하겠는데... 64%, 73%에서 틀리니 뭐 도저히 생각이 안 나더군요.


처음에는 계산 과정 중 부동소수 오차가 발생했을 것이라 판단하고 마지막 부분에 오차를 보정해주었는데,

두 번째부터는 어디서 오류가 나는지 잘 모르겠네요..


도대체 무슨 오류인가 궁금합니다.. 아시는 분은 댓글 좀 부탁드립니다!

제출 언어는 C++11이고 필요한 부분에는 주석을 달아놓았으니, 문제 해결되면 소스코드는 지워두도록 하겠습니다 ㅠㅠ


p.s. 이 문제 도전하실 때, 부동소수점 연산과 실수 INF에 주의하세요!

didwlvv   6년 전

저도 비슷하게 60퍼대에서 틀리는데 좀만더 설명해주실수있을까요?

어떤걸 주의하라는지 잘 감이 안옵니다 ㅠㅠ

gallopsys   6년 전


혹시 어떻게 푸셨는지 설명 가능하신가요? 얼핏 소스코드를 읽어봤는데 길어서 명확하게 이해가 안 되네요...

부동소수점 문제를 주의하라는 소리는 부동소수점 오차 범위를 조심하라는 소리고, INF를 주의하라는 소리는 double에서 0으로 나누는 경우 자동으로 INF가 발생하게 되는데 그걸 함부로 비교하면 위험하다는 소리였습니다.

만약 기울기를 비교하고 싶은 거라면 a/b == c/d 임을 비교하는 대신(INF 비교 가능성) a*d == b*c임을 비교하는 게 더 안전하겠죠?

didwlvv   6년 전

일단 처음에 3점을 x로 정렬을 하고  x축으로 일자거나 y축으로 일자를 확인합니다.

그리고 기울기를 조사하는데 분모가 0이면 안만들어요 그렇게 내려가서 else문으로 

3점으로 3변이 만들어지는데 거기서 2변을 선택해서 *2를합니다. 그러면 둘레가 나오기때문에 거기서 최댓값하고 최솟값을 구해서 빼는식으로 구현했습니다.

gallopsys   6년 전

제가 기억하기론 60%대에서 틀린 이유가 부동소수점 오차 때문에 틀렸었고, 70%대는 아예 잘못된 비교를 해서 틀린 걸로 알고 있거든요..

한 번 최대값 - 최소값을 하실 때 뒤에 1e-10~1e-15 정도의 값을 더한 후 제출해보세요!

didwlvv   6년 전

후아.. 안되네요 ㅠㅠㅠ 

좀더 생각해봐야할거같아요 ㅠ

jhunh   6년 전

저는 딱 60% 들어가서 틀리네요..

부동소수점 오차인듯 한데 어떻게 잡는건지..ㅠㅠ (max-min)+(1e-10) 해봤지만 그래도 틀리네요..

gallopsys   6년 전

어떤 방식으로 접근했는지 알 수 있을까요?

jhunh   6년 전

1단계에서 3개의 점의 x축이 모두 같거나 y축이 모두 같다면 -1을 출력하고 종료합니다


그게 아니라면

받은 세개의 점을 각각을 이은 길이를 구하고

AB가 대각선일때, AC가 대각선일때, BC가 대각선일때 이렇게 3개를 가정해 둘레를 3개구했습니다.

그리고 그 3개의 둘레중 가장 큰값에서 가장 작은값을 빼서 출력했습니다.


C언어 사용해서 double형식으로 했습니다 ㅠㅠ..

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