백준 온라인 저지 2477번 문제 풀이 [문제 링크]
제한된 데이터와 반복되는 패턴을 활용하여 각 변이 서로 평행하거나 수직인 육각형의 넓이를 구하는 방법.
위 그림은 밭이 어떤 방향으로 회전한 모양이든 나올 수 있는 모든 방향 입력값의 패턴이다.
즉, A가 상, 하, 좌, 우 중 어느 것이든 두 번 반복된다는 점, 그리고 어느 꼭짓점을 시작으로 입력받느냐에 따라 위의 그림과 같은 6 가지 중 하나일 수밖에 없다는 점에 따른 패턴인 것이다.
그리고 첫 번째 입력값을 가장 뒤로 보내는 것을 반복하면 5번 안에 반드시 아래와 같은 패턴을 갖게 된다.
그러므로 아래와 같은 순서를 따라 계산하면 답을 구할 수 있다.
- 입력받은 패턴이 A B A B C D 인지 확인한다.
- 아니라면 첫 번째 입력값을 가장 뒤로 보내고 다시 확인한다.
- A B A B C D 패턴이 될 때까지 반복한다. (재귀)
- A B A B C D 패턴이 되면 첫 A와 첫 B 값에 대응하는 길이를 서로 곱한다. ()
- A B A B C D 패턴에서 두 번째 B 값과 C 값에 대응하는 길이를 서로 곱한다. ()
- 앞서 구한 값을 서로 더한 값이 답이다. ()
K = int(input())
ds = []
ss = []
for _ in range(6):
direction, size = map(int, input().split())
ds.append(direction)
ss.append(size)
def solution(directions, sizes, K):
if directions[0] == directions[2] and directions[1] == directions[3]:
area = sizes[0] * sizes[1] + sizes[3] * sizes[4]
ans = area * K
print(ans)
else:
tmpD = directions.pop(0)
directions.append(tmpD)
tmpS = sizes.pop(0)
sizes.append(tmpS)
solution(directions, sizes, K)
solution(ds, ss, K)