파이썬 코딩테스트 강좌, 부녀회장이 될 테야

부녀회장이 될 테야 – 파이썬 코딩테스트 강좌

이번 글에서는 파이썬을 활용한 알고리즘 문제 풀이 강좌로, “부녀회장이 될 테야”라는 유명한 문제를 다루어 보겠습니다.
이 문제는 주어진 조건을 기반으로 동적 계획법을 활용한 풀이를 요구합니다.
우리는 문제를 정의하고, 예제를 통해 방법을 시연하며, 최종적으로 코드를 작성하여 문제를 해결할 것입니다.

문제 설명

문제:
부녀회장은 A층의 B호에 살고 있는 N명의 아파트 주민입니다.
아파트는 K층까지 있으며, 각 층의 호수는 1부터 K까지 있습니다.
A층의 B호에 살고 있는 주민의 총 인원 수를 구하는 문제입니다.
A층의 B호에 살고 있는 주민의 수는 각 층의 호수에 따라 달라지며, 규칙은 다음과 같습니다:

  • A층 B호 주민 수 = A층 1호 주민 수 + A층 2호 주민 수 + … + A층 B호 주민 수
  • 1층의 B호 주민 수는 B입니다.

예를 들어, 3층의 4호 주민 수를 알고 싶다면 3층 1호부터 3층 4호까지의 주민 수를 모두 더해야 합니다.
문제는 주어진 A와 B에 대해 A층 B호의 주민 수를 구하는 것입니다.

입력 및 출력 형식

입력:
첫 줄에 테스트 케이스의 수 T가 주어집니다.
이후 T줄에 걸쳐 각 테스트 케이스마다 A와 B가 주어집니다.

출력:
각 테스트 케이스마다 A층 B호의 주민 수를 출력합니다.

예제

입력 예시:
2
1 3
2 3

출력 예시:
3
6

문제 해결 접근법

이 문제를 해결하기 위해서는 다음과 같은 동적 계획법(Dynamic Programming) 접근법을 사용할 수 있습니다.
각 층의 호수에 대해 주민 수를 저장하는 2차원 테이블을 생성하여 문제를 해결할 수 있습니다.

1단계: 테이블 초기화

1층의 주민 수는 각 호수에 따라 항상 같은 값이므로, 이를 기본으로 테이블을 초기화합니다.

2단계: 동적 계획법 관계 설정

각 층의 B호에 대한 주민 수는 그 전 층의 모든 주민 수의 합으로 표현할 수 있습니다.
따라서 점화식은 다음과 같습니다:

    dp[A][B] = dp[A-1][1] + dp[A-1][2] + ... + dp[A-1][B]

3단계: 반복과정

위의 점화식을 활용하여 A층과 B호에 대해 반복문을 통해 값을 계산합니다.
이렇게 해서 최종적으로 A층 B호의 주민 수를 얻을 수 있습니다.

코드 풀이


def calculate_people(A, B):
    # A층 B호의 주민 수를 계산하는 함수
    dp = [[0] * (B + 1) for _ in range(A + 1)]
    
    # 1층 초기화
    for j in range(1, B + 1):
        dp[1][j] = j
    
    # 동적 계획법을 이용한 주민 수 계산
    for i in range(2, A + 1): # A층
        for j in range(1, B + 1): # B호
            dp[i][j] = sum(dp[i-1][k] for k in range(1, j + 1))
    
    return dp[A][B]

# 테스트 케이스 처리
T = int(input())
for _ in range(T):
    A, B = map(int, input().split())
    print(calculate_people(A, B))

결론

이번 문제를 통해 동적 계획법의 적용을 살펴보았습니다. 주어진 문제를 해결하기 위해 문제를 분석하고,
알고리즘을 설계하는 것이 얼마나 중요한지를 이해할 수 있었습니다.
다른 코딩 테스트 문제를 해결할 때도 이런 접근 방식을 통해 보다 효율적인 해결책을 찾을 수 있을 것입니다.

문제를 해결하기 위해 더 많은 연습이 필요합니다. 다양한 문제를 풀어보며 알고리즘 사고방식을 기르기를 바랍니다.

여러분의 성공적인 코딩 시험을 기원합니다!