ngd라는 닉을 사용하는 고등학교 후배가 있다.
분명히 몇 년전에는 코딩을 가르쳐줬던 후배인데, 기하에 미쳐가고 있는 것 같다.
계속 질문을 하는데, 난 기하 알고리즘을 공부한 적이 없어서, 공부를 시작하게 되었다..
ngd에게 감사의 말을 전한다..^^ 갑자기 기하를 시작하게 해줘서^^
아무튼, Convex Hull이 대충 무슨 알고리즘인지는 알고있는 상황이었다.
그래서 바로, Convex Hull을 구현해보려고 했는데, 너무 비효율적인 코드가 잔뜩 쏟아졌고, 결국 구글링을 해가면서
여러 사람들의 Convex Hull 구현 코드들을 분석했다.
그 중에서, 이 분의 블로그 글이 제일 나은 것 같았다.
그림, 설명이 너무 완벽해서 굳이 내가 또 똑같은 설명 적어놓을 이유는 없을 것 같다.
이제 저 블로그의 코드를 분석하고 나니,
좌표평면에 여러 점들이 있을 때, Convex Hull에 포함되는 점, 그리고 그 개수를 구할 수 있었다.
"그럼 백준을 풀어보자!" 해서 아래 문제들을 풀게 되었다.
https://www.acmicpc.net/problem/1708
https://www.acmicpc.net/problem/3679
https://www.acmicpc.net/problem/1310
1708번, 1310은 단순히 그냥 위에서 분석한 코드를 그대로 쓰면 되었다.
3679번은 단순해 보이지만, 그리 단순하진 않다.(사실 Convex Hull문제라기 보단, CCW 문제이긴 하다.)
뭐, 정렬 기준을 처음부터 잘 짜놓으면 상관없을 수도 있지만, 그런 코드는 못본것 같다.
최대한 힌트를 주듯 안주듯 하자면, 0번째 점으로 시작해서 쭉 순환해서 돌아오는데, 다시 0번째 점으로 돌아올 때의 직선에 대해 주목해봐야 한다. :)
이제, Convex Hull을 조금은 알것 같았다.
그래서 아래 링크에서 다른 유형을 찾아봤다.
https://solved.ac/problems/algorithms/20
문제들을 몇 개 들여다 보니, Convex Hull을 구하고 나면,
Convex Hull을 구성하는 점 중에 "주어진 점들 사이의 최대 거리를 가지는 두 점"이 포함된다는 것을 이용하는 것 같았다.
그 관련 이론은 회전하는 캘리퍼스 인데, 이에 대한 설명은 아래 링크가 제일 꼼꼼히 되어있는 것 같다.
https://www.slideshare.net/ssuser88a8b3/2-57761427
코드는 요기를 참고하고 해봤다. 위에 이론을 안 보고 코드를 보면 이해가 1도 안될 수도 있다.
이제, 백준 문제를 바로 풀어봤다.
https://www.acmicpc.net/problem/9240
9240번 문제는 별다른 활용은 없다.
https://www.acmicpc.net/problem/10254
10254번 문제는 단지, 테스트케이스 형 문제이기 때문에 변수 초기화, loop 확인 등만 해주면 쉽게 풀 수 있었다.(주의 ccw를 -1,0,1 로 리턴하는 형식이 아니면 오버플로우날 수 있다. long long 으로 하자)
일단, 오늘 공부를 완료한 건 여기까지이다.
지금 또 풀고 있는 문제는
https://www.acmicpc.net/problem/3878
이다.
아이디어는 떠올랐는데, 아래 링크를 참고해서 공부중이다.
https://jason9319.tistory.com/358
시험기간에 시험공부하기 싫어서 알고리즘 공부하는 모순적인 상황이 일어났다.
다시한번, 저어어엉말~ 고맙다 ngd
Rmx
'내가 공부하려고 만들어가는 목록' 카테고리의 다른 글
[내공만목] 대충 어린이날에 푼 골드 문제들 정리 (0) | 2020.05.05 |
---|---|
[내공만목] 어쩌다가 knapsack 문제들을 풀게 되었다. (0) | 2020.05.03 |
[내공만목] erdos-ginzburg-ziv theorem && Zero sum problem (0) | 2020.04.11 |
[내가 공부하려고 만들어가는 목록] 목표 01 (2) | 2020.04.10 |
[내공만목] 다익스트라 알고리즘을 다시 공부하면서 (0) | 2020.02.26 |