[2775번 - 파이썬] - 부녀회장이 될테야

2023. 2. 22. 14:11Algorithm

솔직히 난 너무 어려웠다. 처음 풀 때는 남들이 푼 것도 다 보고해 봤지만 이해가 안 됐다. 여러 부분에 문제가 있었겠지만 기본적으로 기본 개념이 부족한 거 같았다. 

이걸 보고 있다면 보기 전에 이중리스트, 파이썬 math 라이브러리에서 comb 쪽을 다시 공부하고 보는 게 좋을 거 같다. 

  • 1번 풀이 이중 리스트를 이용한 풀이
  • 2번 풀이 라이브러리를 이용한 풀이
 

문제를 풀기 전에 생각해둬야되는 조건들

  1. 테스트 개수 첫줄에 입력
  2. 각층 호수를 한줄씩 입력
  3. 문제에서 0층은 0~i 라고 했으니 그 값 설정
  4. 1층 이상의 거주민 수 구하기
  5. 3, 4번의 값들을 담을 이중 리스트 구성하기

1번 이중 리스트를 이용한 풀이 방법 - 전체 코드

t = int(input()) # 테스트 케이스 수 입력받기

for _ in range(t):
    k = int(input()) # 층 수 입력받기
    n = int(input()) # 호실 수 입력받기

    # 각 층과 호실마다 거주민 수를 저장하는 2차원 리스트 초기화
    arr = [[0] * (n+1) for _ in range(k+1)]

    # 0층 거주민 수 초기화
    for i in range(n+1):
        arr[0][i] = i

    # 각 층의 거주민 수 구하기
    for i in range(1, k+1):
        for j in range(1, n+1):
            arr[i][j] = arr[i-1][j] + arr[i][j-1]

    print(arr[k][n]) # 결과 출력
    # 각 층과 호실마다 거주민 수를 저장하는 2차원 리스트 초기화
    arr = [[0] * (n+1) for _ in range(k+1)]

여기 부분 arr이는 초기화하는 부분으로써 총 층수와 호수를 이용해 0으로된 리스트들을 만든다.

 

    # 0층 거주민 수 초기화
    for i in range(n+1):
        arr[0][i] = i
        print(arr)
    # 각 층의 거주민 수 구하기
    for i in range(1, k+1):
        for j in range(1, n+1):
            arr[i][j] = arr[i-1][j] + arr[i][j-1]

0층 거주민 수들을 아까 만든 이중 리스트의 0번째에 i 값들을 집어 넣는다 - print(arr) 값이 제대로 들어갔는지 확인해기 위해서 사용

1층 이상 거주민들을 이중 리스트에 집어 넣는데 맨 하단 부분에서는 

            arr[i][j] = arr[i-1][j] + arr[i][j-1] 노란 부분은 i -1 층 ( 현재 i 값으 아래층 ) j ( 현재 j층 아래층 ) 값을 가져오고 주황색 부분은 i 층 ( 현재 층 j 층 이전 값들의 합을 말한다 )의 이전 값들을 더해진 값들을 가져온다.

 

진짜 어려운듯

 

2번 math 함수의 cemb을 이용해 풀기 

cemb(n, m) => nCm 을 말한다 

import math

t = int(input())
people = []
for i in range(t):
    k = int(input())
    n = int(input())

    # 각 층별로 필요한 인원 수 계산
    for j in range(k+1):
      num_p = math.comb(j+n, j)
      people.append(num_p)

    # 총 인원 수 출력
    print(people[k])