-
백준 2698번 인접한 비트의 개수 (JAVA)알고리즘(Algorithm)/다이나믹 프로그래밍(DP) 2021. 5. 27. 22:58
백준 2698 인접한 비트의 개수
https://www.acmicpc.net/problem/2698
2698번: 인접한 비트의 개수
첫째 줄에 테스트 케이스의 수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 수 2개가 공백으로 구분되어 이루어져 있다. 첫 번째 수는 n이고, 두 번째 수는 k이다. n과
www.acmicpc.net
문제
0과 1로 이루어진 수열 S가 있다. S의 첫 수는 s1이고, 마지막 수는 sn이다. S의 인접한 비트의 개수는 다음과 같이 구할 수 있다.
s1*s2 + s2*s3 + s3*s4 + ... + sn-1 * sn
위의 식을 이용하면 수열 S에서 인접한 1의 개수를 구할 수 있다. 예를들어, 011101101의 인접한 비트의 개수는 3이 되고, 111101101은 4, 010101010은 0이 된다.
수열 S의 크기 n과 k가 주어졌을 때, 인접한 비트의 개수가 k인 수열 S의 개수를 구하는 프로그램을 작성하시오.
예를 들어, n이 5이고, k가 2이면, 수열 S가 될 수 있는 수열은 다음과 같이 6가지가 있다.
11100, 01110, 00111, 10111, 11101, 11011
입력
첫째 줄에 테스트 케이스의 수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 수 2개가 공백으로 구분되어 이루어져 있다. 첫 번째 수는 n이고, 두 번째 수는 k이다. n과 k는 100을 넘지 않는 자연수이다.
출력
각 테스트 케이스에 대해 인접한 비트의 개수가 k인 수열 S의 개수를 한 줄에 하나씩 출력한다. 이 값은 2,147,483,647보다 작거나 같다.
소스 코드
- 동적계획법(DP)
- DP 2개를 사용하거나 3차원 배열 DP를 사용
import java.io.*; import java.util.StringTokenizer; //acmicpc.net/problem/2698 /* 수열의 각 자리는 0 or 1 1) 마지막 비트가 0일 때 - 이전 비트가 0 : 인접한 비트 수 변화 X - 이전 비트가 1 : 인접한 비트 수 변화 X 2) 마지막 비트가 1일 때 - 이전 비트가 0 : 인접한 비트 수 변화 X - 이전 비트가 1 : 인접한 비트 수 변화 O */ public class Main { private static int T, N, K, Ans; private static int[][][] dp; // dp[n][k][i] -> i : 마지막(이든 시작값이든 이해 편한 값으로 생각) 비트 값(0/1), n : 길이, k : 인접한 비트 수 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st; T = Integer.parseInt(br.readLine()); for (int tc = 1; tc < T+1; tc++) { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); K = Integer.parseInt(st.nextToken()); dp = new int[2][N+1][N]; dp[0][1][0] = 1; dp[1][1][0] = 1; for (int n = 2; n < N+1; n++) { for (int k = 0; k < K+1; k++) { dp[0][n][k] = dp[0][n-1][k] + dp[1][n-1][k]; if(k == 0) dp[1][n][k] = dp[0][n-1][k]; else dp[1][n][k] = dp[0][n-1][k] + dp[1][n-1][k-1]; } } Ans = dp[0][N][K] + dp[1][N][K]; bw.write(String.valueOf(Ans) + "\n"); bw.flush(); } bw.close(); br.close(); } }
'알고리즘(Algorithm) > 다이나믹 프로그래밍(DP)' 카테고리의 다른 글
백준 1904번 01타일 (JAVA) (0) 2022.02.12 백준 9641번 파도반 수열 (JAVA) (0) 2022.02.12 백준 2748번 피보나치 수 2 (JAVA) (0) 2022.02.12 백준 1149번 RGB거리 (JAVA) (0) 2022.02.12 백준 1003번 피보나치 함수 (JAVA) (0) 2021.05.27