아아아아아아 ! 너무 싫어라.
조건을 제대로 이해하지 못하고 문제를 풀어서 한없이 어려워지고 있었다가, 나중에서야 제대로 읽고 성공적으로 풀었다.
조건은 다음과 같다.
- ㄱ을 90. 180, 270도로 돌린 형태의 육각형이 주어진다.
- 동:1, 서:2, 남:3, 북:4 와 함께 변의 길이가 주어진다.
- 이는 반드시 반시계 방향으로 주어진다.
- 처음에 주어지는 1m^2당 자라는 참외의 개수와 이 도형의 넓이를 곱해서 총 생산량을 구해주면 된다.
기본적으로 최대 변을 기준으로 한 최대 사각형의 넓이 - 공백 사각형의 넓이 방법으로 푸는 것을 택했다.
그러나 3번 조건을 못봐서... 복잡하게 생각했다. 객체로 모든 변을 만들고 방향을 비교하면서 했는데, 계속 틀렸다.
저 조건을 깨닫고 나니 약간의 패턴이 보였다.
반시계 방향이므로 어떻게든 가로세로 가장 긴 변은 인덱스가 붙어있게 된다. 그러면 두번째 변 기준 +2랑 +3 이 반드시 공백 사각형의 변이 된다. 따라서 그것만 구해주면 된다.
인덱스 조심!
n = int(input())
lst= []
for i in range(6):
dr, l = map(int, input().split())
lst.append([l, dr])
first_line_i = 0
for i in range(len(lst)):
if lst[i][0] > lst[first_line_i][0]:
first_line_i = i
if first_line_i == 0:
if lst[1][0] > lst[len(lst) - 1][0]:
second_line_i = 1
else:
second_line_i = first_line_i
first_line_i = len(lst) - 1
elif first_line_i == len(lst) - 1:
if lst[0][0] > lst[len(lst) - 2][0]:
second_line_i = 0
else:
second_line_i = first_line_i
first_line_i = len(lst) - 2
else:
if lst[first_line_i + 1][0] > lst[first_line_i - 1][0]:
second_line_i = first_line_i + 1
else:
second_line_i = first_line_i
first_line_i -= 1
print(n * (lst[first_line_i][0] * lst[second_line_i][0] - lst[(second_line_i + 2) % 6][0] * lst[(second_line_i + 3) % 6][0]))
코드가 좀 긴데, 더 깔쌈하게 푸는 방법도 있겠지만 나는 가장 직관적인 방법을 선택했다. 사실 이러면 변의 방향을 전혀 안 쓰고 풀 수 있다.
그냥 제일 긴 변 하나를 잡고, 그 전후를 살펴보면서 더 긴 변을 찾는다. 어차피 가장 긴 변은 붙어있으니 반드시 있다. 그게 첫째 변의 인덱스 이후라면 단순히 두 번째 변을 해당 인덱스로 설정하고, 그게 첫째 변의 인덱스 이전이라면 첫째 변은 사실 둘째 변인 것이므로 둘이 바꿔준다.

'Algorithms' 카테고리의 다른 글
백준 1002. 터렛 (0) | 2022.06.09 |
---|---|
백준 3053. 택시 기하학 (0) | 2022.06.09 |
백준 3034. 앵그리 창영 (0) | 2022.06.09 |
백준 4153. 직각삼각형 (0) | 2022.06.09 |
백준 3009. 네 번째 점 (0) | 2022.06.09 |
댓글