본문 바로가기
백준/DP

백준 5557. 1학년

by 29살아저씨 2021. 9. 27.
반응형

🅰 백준 5557. 1학년

 

5557번: 1학년

상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀

www.acmicpc.net

✏️ 문제 풀이

  • 2차원 배열을 이용해서 각 수식을 순서대로 +, - 해서 dp[][] index에 저장한다.
  • 행은 각 수식의 수만큼 만들고 계산되는 수식은 0~20 사이에 있기 때문에 열은 0~20으로 생성한다.
  • dp[N+1][21]
  • 계산해서 나오는 값들은 index로 표현할 수 있기 때문에 각 숫자마다 +연산을 한 값이 20보다 작거나 같으면      dp[i][j+number[i]] += dp[i-1][j], -연산을 한 값이 0보다 크거나 같으면 dp[i][j-number[i]] -= dp[i-1][j]가 된다.
  • 이전 값을 계속해서 더해주는 이유는 연산을 하다보면 8이라는 숫자가 2번 3번 중복되서 나올 수 있기 때문에 이전값을 계속해서 더해주면 마지막에 나오는 수를 index로 하여 검색을 하면 dp[N-1][number[N]] 에 저장된 값이 마지막에 나오는 수가 되기위해 계산할 수 있는 등식의 수가 된다.

✏️ 소스코드

package dp;

import java.io.*;
import java.util.*;

public class Main_골드5_5557_1학년 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int number[] = new int[N + 1];
		long dp[][] = new long[N + 1][21];
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		for (int i = 1; i <= N; i++) {
			number[i] = Integer.parseInt(st.nextToken());
		}
		dp[1][number[1]] = 1;
		for (int i = 2; i < N; i++) {
			for (int j = 0; j <= 20; j++) {
				if (dp[i - 1][j] == 0)
					continue;
				int plusInput = j + number[i];
				int minusInput = j - number[i];
				if (minusInput >= 0) {
					dp[i][minusInput] += dp[i - 1][j];
				}
				if (plusInput <= 20) {
					dp[i][plusInput] += dp[i - 1][j];
				}
			}
		}
		System.out.println(dp[N-1][number[N]]);
	}
}

 

✅ 후기

  • 2차원 배열로 접근하는 비슷한 문제라 쉽게 생각할 수 있었다. dp는 많이 풀면 풀수록 익숙해지는 유형인 것 같다.
반응형

'백준 > DP' 카테고리의 다른 글

백준 1495. 기타리스트  (0) 2021.09.27
백준 12920. 평범한 배낭 2  (0) 2021.09.27
백준 12865. 평범한 배낭  (0) 2021.09.26
백준 2294. 동전 2  (0) 2021.09.26
백준 11066 파일합치기  (0) 2021.09.26

댓글