일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 백준
- 노마드코더
- 이친수문제
- CSS Flex
- scroll-snap
- 2193
- ESP8266WiFi
- 백준자바
- C
- @supports
- 백준15988풀이
- 포인터
- ESP-01
- ESP8266
- 리액트네이티브
- aspect-ratio
- scss
- 프로젝트초기설정
- CSS
- peap
- reactNative
- dp문제
- Flexible box
- 백준문제풀이 #백준 #백준문제 #스타트택시
- 백준java
- 백준풀이
- 백준 #백준2661 #좋은수열 #Java #코딩
- 연결리스트
- 아두이노 우노
- ESP-01WiFi
- Today
- Total
코딩 농장
[백준 2193번/JAVA] 이친수(문제 풀이, 코드) 본문
이친수
[문제]
0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다.
- 이친수는 0으로 시작하지 않는다.
- 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.
예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.
N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.
[풀이]
dp 문제라고 생각이 된다. 규칙을 찾아보자.
N | 1 | 2 | 3 | 4 | 5 |
이친수 | 1 | 10 | 100 101 |
1000 1010 1001 |
10000 10100 10010 10001 10101 |
[내 코드 알고리즘]
0으로 시작하지 않으니 1번째 자리는 무조건 1이다. dp[0][1] = 1; ( 1번째자리에 1이 들어간 이친수의 개수가 1이라는 의미)
이 뒤로는 0을 붙일지, 1을 붙일지 선택한다.0을 붙이는 경우dp[i][0] = dp[i-1][0] + dp[i-1][1]0의 경우는 앞이 1이든 0이든 상관없으니까 앞자리가 0인 경우의 수 + 1인 경우의 수를 다 더하면 된다.1을 붙이는 경우dp[i][1] = dp[i-1][0];1은 연속해서 올 수 없으니 앞자리가 무조건 0이어야한다. 그러니 앞자리가 0인 경우의 수!
[코드]
package o;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class twofrinum_2193 {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long[][] dp = new long[N][2];
dp[0][1] = 1;
// 1, 10
// 100, 101
// 1000, 1010 (이전 dp의 뒷자리에 0붙이기)
// 1001 (이전 dp의 자리에 1붙이기)
for(int i=1; i<N; i++) {
dp[i][0] += dp[i-1][0] + dp[i-1][1];
dp[i][1] += dp[i-1][0];
}
System.out.println(dp[N-1][0]+dp[N-1][1]);
}
}
[추가적인 내용]
위의 규칙을 점화식으로 나타내면 피보나치 수열과 같다고 한다.
F0=0, F1=1, Fn+2=Fn+1+Fn
피보나치 수열의 점화식은 위와 같다.
이 문제의 점화식은 다음과 같다.
dp[1][0] = 0
dp[1][1] = 1
=> dp[1] = 1
dp[2][0] = dp[1][0] + dp[1][1] = 0 + 1 = 1
dp[2][1] = dp[1][0] = 0
=> dp[2] = 1
dp[3][0] = dp[2][0] + dp[2][1] = 1 + 0 = 1
dp[3][1] = dp[2][0] = 1
=> dp[3] = 2
dp[4][0] = dp[3][0] + dp[3][1] = 1 + 1 = 2
dp[4][1] = dp[3][0] = 1
=> dp[4] = 3
dp[n+2] = dp[n+1]+dp[n]
GitHub에 티스토리에 올리지 않은 코드들도 업로드 되어 있습니다.
https://github.com/MOBUMIN/BJalgorithm/blob/master/02000-02999/twofrinum_2193.java
MOBUMIN/BJalgorithm
백준 알고리즘 푼 것. Contribute to MOBUMIN/BJalgorithm development by creating an account on GitHub.
github.com
'백준' 카테고리의 다른 글
[백준 9613번/JAVA] GCD 합 (문제 풀이, 코드) (0) | 2021.07.05 |
---|---|
[백준 1065번/JAVA] 한수 (문제 풀이, 코드) (0) | 2021.06.25 |
[백준 11049번/JAVA] 행렬곱셈순서 (문제 풀이, 코드) (0) | 2021.02.04 |
[백준 1261번/JAVA] 알고스팟 (문제 풀이, 코드) (0) | 2021.01.11 |
[백준 10451번/JAVA] 순열 사이클 (문제 풀이, 코드) (0) | 2020.12.06 |