728x90
https://www.acmicpc.net/problem/25308
25308번: 방사형 그래프
게임 캐릭터의 능력치를 한 눈에 보기 좋게 나타내는 방법으로 방사형 그래프가 있다. 캐릭터는 8개의 능력치를 갖고 있고 각 능력치를 $a_1, a_2, \cdots, a_8$이라고 하면, 그래프는 팔각형 형태이고
www.acmicpc.net
특정 인덱스를 기준으로 왼쪽과 오른쪽의 각도 합을 통해 풀 수 있는 문제였습니다.
from itertools import permutations
import math
def solution(data_list):
# 데이터를 조합
permute_data = permutations(data_list, 8)
# 카운트
count_convex = 0
# 인덱스를 돌아가면서 판단
for data in permute_data:
for idx in range(8):
if not cal_deg(data, idx):
break
elif idx == 7:
count_convex += 1
print(count_convex)
# 특정 인덱스의 볼록을 판단하는 함수
def cal_deg(data_list, idx):
# 양 옆 인덱스
left_idx = idx-1
right_idx = (idx+1)%8
# 왼쪽 밑변
left_bottom = ((1/math.sqrt(2))*data_list[left_idx]) - data_list[idx]
# 왼쪽 높이
left_height = (1/math.sqrt(2))*data_list[left_idx]
# 왼쪽 각도
left_deg = math.degrees(math.atan(left_height/left_bottom))
if left_deg < 0:
left_deg += 180
# 오른쪽 밑변
right_bottom = ((1/math.sqrt(2))*data_list[right_idx]) - data_list[idx]
# 오른쪽 높이
right_height = (1/math.sqrt(2))*data_list[right_idx]
# 오른쪽 각도
right_deg = math.degrees(math.atan(right_height/right_bottom))
if right_deg < 0:
right_deg += 180
# 오른쪽 각도와 왼쪽 각도의 합이 180 보다 작으면 오목
if left_deg + right_deg < 180:
return False
else:
return True
data_list = list(map(int, input().split()))
solution(data_list)
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 1786 <찾기> Python (0) | 2023.12.21 |
---|---|
백준 17386 <선분 교차 1> Python (0) | 2023.12.18 |
백준 11758 <CCW> Python (1) | 2023.12.17 |
백준 2166 <다각형의 면적> Python (0) | 2023.12.16 |
백준 4386 <별자리 만들기> Python (1) | 2023.12.15 |