[Kotlin] 백준(BOJ) 2193 이친수

2026. 2. 9. 01:35·Problem Solving

문제 전문은 아래 버튼을 눌러 확인하실  수 있습니다.

더보기

문제

0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다.

  1. 이친수는 0으로 시작하지 않는다.
  2. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.

예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.

N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N이 주어진다.

 

출력

첫째 줄에 N자리 이친수의 개수를 출력한다.

 

예제 입출력

 

문제 해설

이친수는 다음과 같이 정의할 수 있다. 

 

이진수이다.

 

첫 자리는 반드시 $1$이다. 

 

$1$은 연속될 수 없다. 

 

뒤에서 부터 생각해봤을 때, 끝자리는 $0, 1$ 둘다 올 수 있다.

 

$dp[n][0]$: 길이가 $n$이고 마지막이 $0$인 이친수의 경우의 수

$dp[n][1]$: 길이가 $n$이고 마지막이 $1$인 이친수의 경우의 수 

라고 정의했을 때, 

 

마지막이 $0$인 경우

이전 자리는 $0, 1$ 둘다 올 수 있으므로 다음과 같이 나타낼 수 있다. 

$dp[n][0] = dp[n-1][0] + dp[n-1][1]$

 

마지막이 $1$인 경우

$1$은 연속될 수 없으며, 이전 자리는 $0$이어야 하므로 다음과 같이 나타낼 수 있다.

$dp[n][1] = dp[n-1][0]$

 

결론적으로 점화식은 다음과 같이 나타낼 수 있다. 

$dp[n][0] + dp[n][1] = dp[n-1][0] + dp[n-1][1] + dp[n-1][0]$

 

기저값 구하기

$dp[1][1]$의 경우에는 $1$인 경우밖에 없으므로 경우의 수는 $1$가지이다

$dp[1][0]$의 경우에는 애초에 존재하지 않으므로 $0$가지이다. 

 

위 내용들을 바탕으로 다음과 같이 구현할 수 있다.

소스 코드

fun main() {
    val n = readln().toInt()

    val dp = Array(n + 1) { LongArray(2) }

    dp[1][1] = 1  // "1"

    for (i in 2..n) {
        dp[i][0] = dp[i - 1][0] + dp[i - 1][1]
        dp[i][1] = dp[i - 1][0]
    }

    println(dp[n][0] + dp[n][1])
}

 

 

시간 복잡도

for문 내부에서 상수번 연산을 수행하므로 $O(N)$ 시간 복잡도를 가진다고 할 수 있겠다. 

'Problem Solving' 카테고리의 다른 글

[Kotlin] 백준(BOJ) 11727 2xn 타일링 2  (0) 2026.02.08
[Kotlin] 백준(BOJ) 1912 연속합  (0) 2026.02.07
[Kotlin] 백준(BOJ) 9461 파도반 수열  (0) 2026.02.06
[Kotlin] 백준(BOJ) 11053 가장 긴 증가하는 부분 수열  (1) 2026.02.04
[Kotlin] 백준(BOJ) 1149 RGB거리  (0) 2026.02.03
'Problem Solving' 카테고리의 다른 글
  • [Kotlin] 백준(BOJ) 11727 2xn 타일링 2
  • [Kotlin] 백준(BOJ) 1912 연속합
  • [Kotlin] 백준(BOJ) 9461 파도반 수열
  • [Kotlin] 백준(BOJ) 11053 가장 긴 증가하는 부분 수열
Kirbyyy
Kirbyyy
개인적인 일상과 회고를 기록하는 블로그입니다.
  • Kirbyyy
    커브볼의 생존일지
    Kirbyyy
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • 우아한테크코스 (8)
      • 프로덕트 빌드 (0)
      • Problem Solving (20)
      • C++ (0)
      • Kotlin (19)
      • Java (3)
      • CS (2)
        • AI (2)
      • 취미생활 (0)
        • 서평 (0)
        • 프라모델 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    그리디 알고리즘
    백준 연속 합
    BFS
    Problem Solving
    백준 11123
    분할 정복
    백준
    백준 16174
    다이나믹 프로그래밍
    백준 알고리즘
    백준 16173
    우테코 8기
    ProblemSolving
    백준 파도반 수열
    너비 우선 탐색
    백준 1356
    백준 31575
    백준 33272
    C++
    백준 RGB 거리
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Kirbyyy
[Kotlin] 백준(BOJ) 2193 이친수
상단으로

티스토리툴바