[Silver V] PLAYERJINAH’S BOTTLEGROUNDS - 15803 (python)
기하학, 수학
한때 굉장히 유행하고 유명했던 게임, PLAYERJINAH’S BOTTLEGROUNDS는 FPS(First-Person Shooter) 장르의 게임이다. 전 세계적으로 많은 사람을 열광시킨 이 게임은 영화 Bottle Royale 을 모티브로 만들어졌다. 영화 Bottle Royale 에서는 한 학급의 학생들을 한 섬에 가두고, 그들에게 각자 병을 지급한 뒤, 단 한 명의 승자가 남을 때까지 서로 병 던지기를 시키는 내용이 나온다. 이 게임은 그와 비슷하게 100명의 플레이어가 각자 거대한 수송기에서 낙하산으로 낙하하여 한 명의 승자가 남을 때까지 진행된다.
이 게임을 즐기는 진아는 굉장한 실력의 게이머로서, 그녀의 실력은 화면 속의 적을 동시에 3명까지 맞춰 쓰러뜨릴 정도로 잘한다. 대신에 그녀가 제 실력을 발휘하기 위해선 한 가지 조건이 있다. 그건 적들이 진아의 화면 속에서 직선으로 있을 때만 동시에 쓰러뜨릴 수 있다는 것인데, 몇 번의 승부로 이를 알아챈 준서는 BOTTLEGROUNDS 대회에서 진아를 쓰러뜨리고 우승하기 위해 같은 스쿼드의 팀원들과 특훈을 시작했다. 특훈 내용은 상대방의 화면 속에서 각자의 위치가 직선이 안 되도록 포지션을 잡는 것이다. 준서는 이 연습을 위해서 당신에게 현재 팀원들의 상대방 화면 속 위치들이 직선이 되는지를 판별하는 기계를 만들어 달라고 요청했다. 당신에게 의뢰비로 대회 상금의 30%를 약속했기 때문에 당신은 흔쾌히 제안을 수락했다. 이제 그들에게 전달할 기계의 프로그램을 만들어 보도록 하자.
화면 속 아군 위치의 예시. 이 경우 팀원들은 직선상에 위치한다.
프로그램의 입력은 표준 입력으로 받는다. 스쿼드는 총 4명으로 구성되며 준서는 멀리서 저격을 하기 때문에 좌표가 주어지지 않는다. 따라서 첫 번째 줄부터 세 번째 줄까지 x, y (1 ≤ x, y ≤ 1000) 두 개의 자연수가 각각 주어진다. 각 줄의 x, y는 한 명의 팀원이 상대방 화면에서 어떤 위치인지 나타낸다. 그리고 팀원들은 항상 서로 다른 위치에 있다.
프로그램의 출력은 표준 출력으로 한다. 팀원의 위치가 직선이 될 때 ‘WHERE IS MY CHICKEN?’ 을, 아닌 경우 ‘WINNER WINNER CHICKEN DINNER!’ 를 출력한다.
코드
# CCW 알고리즘 활용
arr = [list(map(int, input().split())) for _ in range(3)]
D = (arr[1][0] - arr[0][0])*(arr[2][1] - arr[0][1]) - (arr[1][1] - arr[0][1])*(arr[2][0] - arr[0][0])
if D == 0:
print('WHERE IS MY CHICKEN?')
else:
print('WINNER WINNER CHICKEN DINNER!')
CCW (Counter-ClockWise)
CCW(반시계 방향, Counter-Clockwise) 알고리즘은 주로 컴퓨터 그래픽스와 계산 기하학에서 점들의 배열이 반시계 방향인지, 시계 방향인지, 혹은 일직선 상에 있는지를 판단하는 데 사용됩니다. 특히, 주어진 세 점이 반시계 방향을 이루는지 시계 방향을 이루는지, 아니면 일직선 상에 있는지를 결정하는 데 사용됩니다. 이 알고리즘은 선분 교차 검사 등 여러 응용 분야에서 중요한 역할을 합니다.
세 점 , B(x2,y2), C(x3,y3)에 대해 CCW 알고리즘은 다음과 같이 작동합니다.
CCW 공식
세 점 A, , 에 대해 CCW 알고리즘은 다음 결정값 를 계산합니다:
D=(x2−x1)⋅(y3−y1)−(y2−y1)⋅(x3−x1)이 값 는 세 점의 방향을 결정합니다:
- D > 0이면, , , 는 반시계 방향을 형성합니다.
- D < 0이면, , , 는 시계 방향을 형성합니다.
- D = 0이면, , , 는 일직선 상에 있습니다.
참고사이트
CCW (Counter-ClockWise) - (1)
CCW (Counter-ClockWise) - (1) CCW 알고리즘은 수 계산에서의 사칙연산처럼, '기하 알고리즘'에서 가장 기본적인 알고리즘이다. 즉, 기하 알고리즘에서 매우 자주 이용된다는 뜻이다. 우선 이 게시글에서
rebro.kr