알고리즘/백준

[백준] 2477. 참외밭 - python

코딩딩 2020. 9. 23. 11:15

www.acmicpc.net/problem/2477

 

2477번: 참외밭

첫 번째 줄에 1m^2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1≤K≤20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지나�

www.acmicpc.net

입력

  • 변의 방향이 동,서(1,2)일 경우 가로변, 변의 방향이 남,북(3,4)일 경우 세로변임을 알 수 있음.
  • 6각형이고 입력이 순서대로 들어오므로 변의 방향과 길이를 저장하기 위한 2차원 배열을 생성하여 저장함.


문제 풀이

  • ㄱ자 모양이라는 것에서 아이디어를 얻음
  • 그림과 같이 큰 사각형에서 작은 사각형을 빼면 ㄱ자 도형의 면적을 구할 수 있음

  • 큰 사각형의 면적
    • 주어진 변의 길이중 가장 긴 가로 변, 세로변의 길이를 구해서 곱하면 됨.
  • 작은 사각형
    • 주어진 정보를 이용해서 가장 긴 가로변을 구할 수 있음. (위에 큰 사각형의 면적을 구하기 위해서도 필요)
    • 최장 가로변 양옆에는 두 개의 세로변이 위치함. 이 때 두 변의 차이를 구하면 우리가 구하고자하는 작은 사각형의 세로변이 됨.
    • 인접한 변의 길이는 배열에 담아 놨으므로 최장 가로변 인덱스 -1, +1을 이용해서 찾아줄 수 있고, 최장 가로변이 어디에 위치하고 있을 지 알 수 없으므로 나머지 연산을 이용해서 인접한 변을 찾을 수 있도록 설정함 


소스코드 - python

	melon = int(input())    #참외수
	arr = [list(map(int,input().split())) for _ in range(6)]
	# print(arr)
	w = 0; w_idx = 0    #가장 긴 가로변 길이, 인덱스 초기화
	h = 0; h_idx = 0    #가장 긴 세로변 길이, 인덱스 초기화
	for i in range(len(arr)):
	    if arr[i][0] == 1 or arr[i][0] == 2:    #방향이 동,서면 가로
	        if w < arr[i][1]:       #가장 큰값,인덱스 찾기
	            w = arr[i][1]
	            w_idx = i
	    elif arr[i][0] == 3 or arr[i][0] == 4:  #남,북이면 세로
	        if h < arr[i][1]:
	            h = arr[i][1]
	            h_idx = i
	# print(w,h)
	#가장 긴 가로변 양옆에 붙어있는 변(세로변)들의 차이 : 뺄 사각형의 세로
	#가장 긴 세로변 양옆에 붙어있는 변(가로변)들의 차이 : 뺄 사각형의 가로
	subW = abs(arr[(w_idx - 1) % 6][1] - arr[(w_idx + 1) % 6][1])
	subH = abs(arr[(h_idx - 1) % 6][1] - arr[(h_idx + 1) % 6][1])
	# print(subW,subH)
	ans = ((w*h) - (subW*subH)) * melon
	print(ans)