[BOJ 문제 풀이] 2477번: 참외밭

Sam Kim·2022년 7월 4일
0

Coding Test

목록 보기
3/3
post-thumbnail

백준 온라인 저지 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 C D 패턴이 되면 첫 A와 첫 B 값에 대응하는 길이를 서로 곱한다. (=a×b= a \times b)
  • A B A B C D 패턴에서 두 번째 B 값과 C 값에 대응하는 길이를 서로 곱한다. (=c×d= c \times d)
  • 앞서 구한 값을 서로 더한 값이 답이다. (a×b+c×d=Answera \times b + c \times d = Answer)

a×b+c×d=Answera \times b + c \times d = Answer

[답안 코드]

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)

0개의 댓글