PS/백준

[BOJ] 17387 선분 교차 2 (C/C++)

uyt8989 2022. 2. 24. 12:15
 

17387번: 선분 교차 2

첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다.

www.acmicpc.net

문제

2차원 좌표 평면 위의 두 선분 L1, L2가 주어졌을 때, 두 선분이 교차하는지 아닌지 구해보자. 한 선분의 끝 점이 다른 선분이나 끝 점 위에 있는 것도 교차하는 것이다.

L1의 양 끝 점은 (x1, y1), (x2, y2), L2의 양 끝 점은 (x3, y3), (x4, y4)이다.

입력

첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다.

출력

L1과 L2가 교차하면 1, 아니면 0을 출력한다.

제한

  • -1,000,000 ≤ x1, y1, x2, y2, x3, y3, x4, y4 ≤ 1,000,000
  • x1, y1, x2, y2, x3, y3, x4, y4는 정수

저번 문제에서 사용했던 CCW 알고리즘을 사용하는 문제. 저번 문제에서는 CCW 이외에도 union-find를 적용해야 했지만 이 문제는 단순히 CCW만 적용하면 됐다.

 

[BOJ] 2162 선분 그룹 (C/C++)

2162번: 선분 그룹 첫째 줄에 N(1 ≤ N ≤ 3,000)이 주어진다. 둘째 줄부터 N+1번째 줄에는 양 끝점의 좌표가 x1, y1, x2, y2의 순서로 주어진다. 각 좌표의 절댓값은 5,000을 넘지 않으며, 입력되는 좌표 사

uyt8989.tistory.com

 

코드를 가져오기만 하면 쉽게 해결될 줄 알았는데 의외로 쉽게 통과되지 않았다. 

 

1. 전역 변수로 y1을 선언했었는데 y1이 재정의되었다는 에러가 자꾸 나왔다. 작업 환경은 비주얼 스튜디오였다. 백준에 제출했을 경우에는 컴파일이 되었는데 비주얼 스튜디오에서 돌리면 계속 에러가 났다. 그 이유는 math.h에 y1이라는 함수가 이미 존재하기 때문이었는데, 백준에서는 math.h를 include하지 않아서 컴파일이 됐지만 비주얼에서는 얘가 괜히 설레발쳐서 빌드가 안 됐다. using namespace std를 빼도 안되길래 그냥 변수명을 수정했다. _y1도 같은 오류가 나서 __y1을 사용하기로 했다. 찾아보니 y1이랑 _y1이 bessel 함수고 전자기파 이론에서 사용된다는데... 전자기파 이론을 공부해본 적이 없어서 잘 모르겠다....

 

2. 입력되는 변수들을 int형으로 사용하고 두 함수 인자 모두 int형으로 넘겨주고 CCW함수 안에서 temp만 long long을 사용했더니 48%쯤에서 틀렸습니다가 나왔다. 그래서 모든 변수를 long long으로 바꿔줬더니 통과했다. 아마 계산 과정에서 overflow가 나면서 틀리는 것 같은데 변수들의 범위가 -백만에서 +백만이라 재수없는 경우에 백만 곱하기 백만 연산을 하게돼서 그런 것 같다. 비주얼 스튜디오에서 나한테 overflow가 날 수도 있다고 연두식 밑줄로 경고해줬었는데 저번 문제에서 해당 문제가 발생하지 않아서 무시했었다. 문제를 풀 때 변수의 범위를 보고 overflow가 발생 가능 여부를 꼼꼼히 따져봐야겠다.

 

 

후기) 

CCW만 적용하는 문제라서 쉽게 갈 수 있을 줄 알았는데 디테일을 놓치는 실수를 했다. 디테일이 나가면 결국 다 나가는거다.

'PS > 백준' 카테고리의 다른 글

[BOJ] 11505 구간 곱 구하기 (C/C++)  (0) 2022.02.26
[BOJ] 14939 불 끄기 (C/C++)  (0) 2022.02.25
[BOJ] 2162 선분 그룹 (C/C++)  (0) 2022.02.23
[BOJ] 16566 카드 게임 (C/C++)  (0) 2022.02.22
[BOJ] 1644 소수의 연속합 (C/C++)  (0) 2022.02.21