문제보고오기
그림을 보면 해당 형태로 그려진다.
이와 같은 문제는 규칙성을 찾는게 가장 중요하므로, 그림을 계속 이어서 그려본다.
다음 그림이 어떻게 그려지는게 순서대로 표기해본다.
규칙성을 찾으면, 점화식 형태로 나타낸다.
문제의 형태가
1. 하위 문제에 대한 중복
2. 부분 문제에 대한 최적
의 형태를 띄고 있으므로, 동적 프로그래밍 방식으로 해결할 수 있다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
// 콘솔 입력 설정 및 변수 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 변수 설정
int T;
int N;
// 100을 넣는 경우 int 자료형을 초과함
ArrayList<Long> P = new ArrayList<>();
// 초기 값 5개를 insert
P.add(1L);
P.add(1L);
P.add(1L);
P.add(2L);
P.add(2L);
try {
// input T
T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
// input N
N = Integer.parseInt(br.readLine());
// 초기값 이거나, 이미 진행한 연산이면
if (N <= P.size()) {
}
// 만약 아직 진행하지 않은 연산이면 ArrayList 에 넣어주기
else {
for (int j = P.size(); j <= N-1; j++) {
P.add(P.get(j-1) + P.get(j-5));
}
}
System.out.println(P.get(N-1));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
해결 코드를 분석해보면, Main class의 main 메서드에 전부 넣은 상황이라, 어디가 입력이고, 어디가 해결코드인지 분간하기가 힘들다.
해당 main 메서드에 꼭 필요한 함수만 들어가게 수정해줄 수 있다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 변수 설정
int T;
int N;
// 100을 넣는 경우 int 자료형을 초과함
ArrayList<Long> P = new ArrayList<>();
// 초기 값 5개를 insert
P.add(1L);
P.add(1L);
P.add(1L);
P.add(2L);
P.add(2L);
try {
// input T
T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
// input N
N = Integer.parseInt(br.readLine());
// output f(N)
System.out.println(findTriangleSizeLength(N, P));
}
} catch (Exception e) {
e.printStackTrace();
}
}
static Long findTriangleSizeLength(int N, ArrayList<Long> P) {
// 만약 아직 진행하지 않은 연산이면 ArrayList 에 넣어주기
if (N > P.size()) {
for (int j = P.size(); j <= N-1; j++) {
P.add(P.get(j-1) + P.get(j-5));
}
}
// 초기값 이거나, 이미 진행한 연산이면 패스하고 리턴
return P.get(N-1);
}
}