반응형
- 알고리즘 분류 : DP(동적계획법), Bottom-Up 방식
- 사용 언어 : JAVA
- 문제 요점
- 마지막 열을 기준으로 윗 스티커를 선택했을 때와 아래 스티커를 선택했을 때의 최댓값을 구하여 큰 값을 반환
- 현재 열의 선택한 스티커를 기준으로 동시에 선택할 수 있는 스티커를 확인하면 된다.
참고한 블로그 : https://fbtmdwhd33.tistory.com/76
소스 설명은 주석을 참고해주세요.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// T : 테스크 케이스의 개수
int T = Integer.parseInt(br.readLine());
// resultArr : 각 테스트케이스의 결과 저장
int[] resultArr = new int[T];
// 테스트 케이스의 수만큼 반복
for(int i=0; i<T; i++) {
int N = Integer.parseInt(br.readLine());
// 배열의 0은 무시할 예정
int[][] arr = new int[3][N+1];
for(int j=1; j<3; j++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int k=1; k<N+1; k++) {
arr[j][k] = Integer.parseInt(st.nextToken());
}
}
// d : 스티커의 길이 별 최대 점수
int[][] d = new int[3][N+1];
// 첫번째 스티커의 열 초기화
d[1][1] = arr[1][1];
d[2][1] = arr[2][1];
// 두번째 스티커부터 확인
for(int g=2; g<=N; g++) {
// 현재 열의 윗 스티커를 골랐을 때
d[1][g] = Math.max(d[2][g-2], d[2][g-1]) + arr[1][g];
// 현재 열의 아랫 스티커를 골랐을 때
d[2][g] = Math.max(d[1][g-2], d[1][g-1]) + arr[2][g];
}
// 큰 값을 결과 리스트에 넣기
resultArr[i] = Math.max(d[1][N], d[2][N]);
}
// 결과 출력
for(int i=0; i<T; i++) {
System.out.println(resultArr[i]);
}
}
}
반응형
'Algorithm' 카테고리의 다른 글
[BAEKJOON] 18406번 : 럭키 스트레이트 (JAVA) (0) | 2022.02.23 |
---|---|
[이것이 코딩테스트다] 11. 그리디 알고리즘 - 유형별 기출문제 풀이 (JAVA) (0) | 2022.02.23 |
[이것이 코딩테스트다] 10. 기타 알고리즘 (0) | 2022.02.22 |
[BAEKJOON] 2573번 : 빙산 (JAVA) (0) | 2022.02.22 |
[BAEKJOON] 9205번 : 맥주 마시면서 걸어가기 (JAVA) (0) | 2022.02.21 |