본문 바로가기
Algorithms

백준 2477. 참외밭

by Brian Go 2022. 6. 9.
 

아아아아아아 ! 너무 싫어라.

조건을 제대로 이해하지 못하고 문제를 풀어서 한없이 어려워지고 있었다가, 나중에서야 제대로 읽고 성공적으로 풀었다.

 

조건은 다음과 같다.

  1. ㄱ을 90. 180, 270도로 돌린 형태의 육각형이 주어진다.
  2. 동:1, 서:2, 남:3, 북:4 와 함께 변의 길이가 주어진다.
  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

댓글