[문제 링크] 👉 https://www.acmicpc.net/problem/2775
설명
아파트 a층 b호에 거주하려면 (a - 1)층의 1호부터 b호까지의 사람들 수의 합만큼 데리고 와야 한다.
이 아파트는 0층부터 있고 1호부터 있다. 0층에는 i호 = i명이 사는데, 1호에는 1명, 2호에는 2명씩 산다는 말이다.
모든 거주자들이 위 조건을 모두 만족하고 거주하고 있다고 했을 때 a층 b호에는 총 몇 명을 데리고 와야 하는지 출력해야 한다.
풀이
2층 3호의 사람 수를 구해야 할 때
1호 | 2호 | 3호 | |
2층 | 1명 | (1+3) = 4명 | (1+3+6) = 10명 |
1층 | 1명 | (1+2) = 3명 | (1+2+3) = 6명 |
0층 | 1명 | 2명 | 3명 |
0층은 사람 수가 일정하므로 먼저 0층의 3호까지의 사람 수를 저장한다.
ho = [i for i in range(1, n + 1)]
다음으로, 1층 2호부터 사람 수를 저장한다. 아래 코드와 같이 저장하면 아래와 같은 표가 된다.
for i in range(1, f + 1):
for j in range(1, n):
ho[j] += ho[j - 1]
1호 | j = 1일 때(2호) | j = 2일 때(3호) | |
i = 2일 때(2층) | 1 | ho[1] = h[1] + h[0] ➜ 3 + 1 = 4 ➜ ho[1, 4, 6] |
ho[2] = h[2] + h[1] ➜ 6 + 4 = 10 ➜ ho[1, 4, 10] |
i = 1일 때(1층) | ho[0] = 1 | ho[1] = h[1] + h[0] ➜ 2 + 1 = 3 ➜ ho[1, 3, 3] |
ho[2] = h[2] + h[1] ➜ 3 + 3 = 6 ➜ ho[1, 3, 6] |
0층 | ho[0] = 1 | ho[1] = 2 | ho[2] = 3 |
마지막으로, 3호의 인덱스는 2이기 때문에 n - 1 인덱스를 출력한다.
print(ho[n - 1])
Solution
t = int(input()) #테스트 케이스
for _ in range(t):
f = int(input())
n = int(input())
ho = [i for i in range(1, n + 1)] #0층, n호까지 사람수 저장
for i in range(1, f + 1): #1층부터 f층까지
for j in range(1, n): #1호부터 n호까지
ho[j] += ho[j - 1]
print(ho[n - 1])
👩💻 회고
자바로 풀다가 다시 파이썬으로 돌아왔다. 자바로 다시 시작하기엔 시간이 다소 부족하다고 판단했다. 오랜만에 파이썬으로 푸는건데도 기억은 다 난다.
'BOJ 코딩테스트 > Bronze' 카테고리의 다른 글
BOJ 10798번 : 세로읽기 (Python/수학/Bronze 1) (1) | 2024.10.15 |
---|---|
BOJ 1934번 : 최소공배수 (Python/수학/Bronze 1) (0) | 2024.10.15 |
BOJ 11721 : 열 개씩 끊어 출력하기 (Java/구현/Bronze 3) (0) | 2024.10.14 |
BOJ 3009 : 네 번째 점 (Java/구현/Bronze 3) (0) | 2024.10.14 |
BOJ 5086 : 배수와 약수 (Java/수학/Bronze 3) (0) | 2024.10.14 |