5557번: 1학년
상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀
www.acmicpc.net
풀이
DP를 사용하여 해결했습니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int N;
public static int[] arr;
// 결과가 2^63 - 1 이하라는 것을 주의
public static long[][] memo;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder("");
N = Integer.parseInt(br.readLine());
arr = new int[N + 1];
memo = new long[N + 1][21];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 1; i <= N; ++i) {
arr[i] = Integer.parseInt(st.nextToken());
}
// 시작 숫자에 해당하는 인덱스 위치의 값을 +1
memo[1][arr[1]]++;
// 맨 마지막 숫자는 결과의미로 맨 마지막 숫자 이전까지 반복
for (int i = 2; i < N; ++i) {
for (int j = 0; j <= 20; ++j) {
// 이전 계산결과의 숫자에 해당하는 인덱스가 0보다 크다면
// 즉, 이전에 계산된 수라는 의미
if (memo[i - 1][j] > 0) {
// 만약 이전의 숫자 j와 현재 숫자인 arr[i]와 더했을때 20보다 작다면
if (arr[i] + j <= 20) {
// 현재 계산된 결과에 해당하는 인덱스의 값에 이전 숫자까지의 결과를 더한다.
memo[i][arr[i] + j] += memo[i - 1][j];
}
// 뺄때 순서를 조심!
// 이전의 숫자에서 빼야하므로 j에다가 현재 숫자를 빼야한다.
// 만약 이전의 숫자 j와 현재 숫자인 arr[i]와 뺏을때 0보다 크다면
if (j - arr[i] >= 0) {
// 현재 계산된 결과에 해당하는 인덱스의 값에 이전 숫자까지의 결과를 더한다.
memo[i][j - arr[i]] += memo[i - 1][j];
}
}
}
}
// 마지막 숫자가 나온 횟수인 arr[N]으로 간다.
System.out.println(memo[N - 1][arr[N]]);
}
}
pyo7410/Algorithm
1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.
github.com
'알고리즘 > 백준' 카테고리의 다른 글
[Java] BOJ 16933번 벽 부수고 이동하기 3 (0) | 2021.06.03 |
---|---|
[Java] BOJ 16235번 나무 재테크 (0) | 2021.06.02 |
[Java] BOJ 15683번 감시 (0) | 2021.05.31 |
[Java] BOJ 17471번 게리맨더링 (0) | 2021.05.30 |
[Java] BOJ 1600번 말이 되고픈 원숭이 (0) | 2021.05.28 |