문제 내용
- “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다”
- 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.
- 위의 조건을 토대로 입력받은 층/호에 몇 명의 사람이 사는지 계산하는 문제
풀이
import java.util.*;
public class Main {
//현재 층의 값을 저장하는 맵
static Map<Integer, Integer> RNS = new HashMap<>();
// 전 층의 값을 저장하는 맵
static Map<Integer, Integer> prevRNS;
static int total = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 반복할 횟수
int T = sc.nextInt();
for (int q = 0; q < T; q++) {
int k = sc.nextInt();
int n = sc.nextInt();
// 0층의 모든 호는 거주자가 1명임을 저장하는 반복문
for (int i = 1; i <= n; i++) {
RNS.put(i, 1);
// -1층은 없으니 0층의 값을 기본 값으로 저장해준다.
prevRNS.put(i, 1);
}
// 입력받은 층의 전 층까지 값을 세팅해준다.
for (int i = 0; i < k; i++) {
setPrevRNS(n);
}
// 전 층의 값을 토대로 입력받은 호의 값을 구한다.
for (int i = 1; i <= n; i++) {
total = total + prevRNS.get(i);
}
System.out.println(total);
// 다음 반복문 실행을 위해 total값을 초기화 해준다.
total = 0;
}
}
// prevRNS를 세팅해주는 메소드
public static void setPrevRNS(int n) {
for (int i = 1; i <= n; i++) {
total = total + prevRNS.get(i);
RNS.put(i, total);
}
total = 0;
prevRNS = RNS;
}
}
후기
- 처음에는 되게 단순해 보였지만 이 전까지의 문제들이 시간제한이 촉박했기 때문인지, 그저 내 생각의 폭이 좁았기 때문인지 굉장히 꼬아서 생각을 하게 되는 바람에 길을 잃고 헤매게 되었다. 결국 검색의 힘을 빌려 길을 다시 돌아가게 되었고, 단순하게 생각을 해보니 생각보다 간단한(그렇게 간단하지는 않았지만) 문제였어서 금방 풀게 되었다.
- 가끔은 머리를 비우고 처음으로 돌아가서 다시 생각해볼줄도 알아야할 것 같다.