본문 바로가기
Algorithm Problem Solving/SW Expert Academy

[Python] SWEA 4869 종이 붙이기

by ʚ⇜❅🎕̈❄⇝ɞ 2021. 7. 30.
728x90
반응형

SWEA SW Expert Academy 4869번 종이 붙이기 문제는 20xN 크기의 직사각형을 테이프로 표시하고, 안에 10x20, 20x20인 종이를 빈틈없이 붙이는 모든 경우를 찾을 때, 몇 개의 테이프 영역이 필요한지 계산하는 문제로 동적 계획법 DP 알고리즘에 관한 문제다.

 

SW Expert Academy 4869번 종이 붙이기 문제 정보

알고리즘 분류

- DP Dynamic Programming 동적 계획법 알고리즘, memoization 메모이제이션

난이도

- D2

 

DP Dynamic Programming 동적 계획법 알고리즘과 예제

 

DP Dynamic Programming 동적 계획법 알고리즘과 예제

포스팅에서 다룰 DP; Dynamic Programming 동적 계획법 알고리즘은 큰 문제를 여러 개의 작은 문제들로 나누어 푸는 방법으로 최적화 문제를 해결하고 프로그램의 전체적인 실행 속도와 성능을 향상할

wondytyahng.tistory.com

 

종이 붙이기 문제 요약

  • 가로 x 세로 길이가 10x20, 20x20인 직사각형 종이가 잔뜩 있다.
  • 20xN 크기의 직사각형을 테이프로 표시하고, 이 안에 준비한 종이를 빈틈없이 붙이는 모든 경우를 찾으려면 테이프로 만든 표시한 영역을 몇 개나 만들어야 되는지 계산한다.
  • N은 10의 배수이고, 범위는 10 이상 300 이하이다.
  • 직사각형 종이가 모자라는 경우는 없다.

문제 풀이 과정

  1. f(n)에서 n을 (테이프 영역의 너비//10), f(n)을 종이를 붙이는 경우의 수라고 한다.
  2. 점화식을 f(n) = f(n-1) + f(n-2) * 2, f(0) = f(1) = 1로 표현할 수 있다.
    • 재귀 함수를 호출하면 엄청난 중복 호출이 존재하여 실행 속도와 성능을 저하시키므로
    • DP 알고리즘과 memoization을 사용하여 이 전 계산 값을 저장하여 다시 계산하지 않고 재 사용할 수 있게 구현한다.
  3. n에 따른 f(n)의 값을 저장해 놓고 필요할 때 사용하여 n의 점화식을 계산한다.
  4. memoization에 저장된 마지막 값을 리턴한다.
  5. 테스트 케이스 번호, 필요한 테이프 영역의 수를 출력한다.

 

코드 및 설명
  • memoization [] - N에 대한 attach_paper(N)의 값들을 저장해놓은 리스트
def attach_paper(N):
    n = N // 10
    memoization = [0] * (n+1)
    memoization[0] = memoization[1] = 1
    # DP
    for i in range(2, n+1):
        memoization[i] = memoization[i-1] + memoization[i-2] * 2

    return memoization[-1]

for t in range(int(input())):
    print("#%d %d" % (t + 1, attach_paper(int(input()))))

SW Expert Academy SWEA 4869번 종이 붙이기 문제는 DP; Dynamic Programming 동적 계획법 알고리즘과 DP의 핵심 기술인 memoization 활용 문제이며 파이썬을 사용하였다. 재귀 함수 호출보다 실행 속도나 성능 면에서 뛰어나다. 난이도는 D2지만 알고리즘을 구현하는데 조금 어려움이 있었다.

 

728x90
반응형