I - Turtle Graphics

 

I번은 실제 대회에 5팀이 푼 문제이지만, 난이도는 높은 편이 아니었습니다.
배치상 뒤에 있었고, 귀찮다는 점에서 건드리지 않은 팀이 많지 않았나 하는 생각입니다.

문제를 간단하게 설명하자면
시작점이 (0, 0)이고 lineto명령어 sequence가 들어올 때 교차하는 점이 발생하지 않게 (cycle이 존재하지 않게)
cycle을 제거하고 chain 형태로 계속 그렸을 때의 선분의 수와 길이를 구하는 문제입니다.

모든 명령을 입력받고 그린 다음 최종 그림에 대한 chain을 구하는게 아닌
각 명령이 수행될 때 마다 chain상태를 유지하면서 그리는 것이기 때문에 문제가 쉬워집니다.

주요 알고리즘은
명령이 하나 들어올 때 마다 이전에 chain에 포함된 선분들을 먼저 그려진 순서대로 교차하는지 검사한 후
교차하는 선분 및 이후에 그려진 선분을 chain에서 제거 해버립니다.
그리고 교차점을 구한 후  교차한 선분의 새로운 시작과 끝을 수정하고 chain에 포함시킵니다.

주의할 점은
길이가 0인 선분일 경우 포함 시키지 않는 것과
같은 직선상에 두 선분이 놓여질 경우만 조심하면 됩니다.

상세 구현은 아래에...



* imyoyo님 께서 말씀하신 nlogn 방법
훨씬 직관적이고 좋네요 :)