문제
https://www.acmicpc.net/problem/2775
문제
평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.
이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.
아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.
입력
첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다
출력
각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라
제한
- 1 ≤ k, n ≤ 14
예제 입력 1
2
1
3
2
3
예제 출력 1
6
10
접근
유일하게 집중해야 할 것은 0층부터 시작한다는 점이고, 0층에는 해당 호수의 숫자만큼 사람이 살고있다.
그리고 이전 층의 1호~해당 호까지 더한 것이기 때문에 어느 층이든 1호에는 한 명만 살게 된다.
만약 2층 3호까지 있는 아파트라면, (k = 2, n =3
)
1호 | 2호 | 3호 | |
0층 | 1명 | 2명 | 3명 |
1층 | 1명 | 1 + 2 = 3명 | 1 + 2 + 3 = 6명 |
2층 | 1명 | 1 + 3 = 4명 | 1 + 3 + 6 = 10명 |
문제는 길지만 로직은 굉장히 간단하다.
0층 각 호에 살고 있는 사람 수를 저장한 뒤, 한 층 올라갈 때 마다 그 호수까지 더해서 해당 호수에 업데이트 해주면 된다.
처음에는 딕셔너리에 층까지 저장할까 했지만, 어차피 문제에서 원하는 건 최종 층이기 때문에 이전 층에서 계속 업데이트해도 된다.
풀이
Python
파이썬은 딕셔너리를 사용했다.
T = int(input())
for _ in range(T):
k = int(input())
n = int(input())
# 호수를 키, 사람 수를 값으로 하는 딕셔너리 생성
floor={}
# 0층 업데이트
for i in range(1,n+1):
floor[i] = i
# ex) {1 : 1, 2 : 2, 3 : 3}
# 그 위의 층
for i in range(k):
# 1호는 어차피 1명이므로 2호부터 시작, 1호부터 하면 j-1에서 에러 발생
for j in range(2,n+1):
floor[j] = floor[j-1] + floor[j]
# ex) {1 : 1, 2 : 4, 3 : 10}
print(floor[n])
Java
자바는 map 클래스를 사용할까 했는데, key로 정렬해주기 귀찮아서 그냥 이차원 리스트로 구현했다.
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
for (int t = 0; t<T; t++){
int k = scanner.nextInt();
int n = scanner.nextInt();
// 1행, n+1열(0층부터 시작하므로) 크기의 이차원 배열 생성
int[][] floor = new int[1][n + 1];
// 0층 업데이트
for (int i = 1; i <= n; i++) {
floor[0][i] = i;
}
// 그 위의 층
for (int i = 1; i<=k; i++){
// 1호는 어차피 1명이므로 2호부터 시작
for (int j = 2; j<=n; j++){
floor[0][j] = floor[0][j-1] + floor[0][j];
}
}
System.out.println(floor[0][n]);
}
scanner.close();
}
}
언어별로 시간, 메모리 비교하는 것도 재밌다. 구현하는 로직별로 알맞은 언어를 골라 쓸 수 있을 정도의 실력이 됐으면 좋겠다!
GitHub 댓글