복's

[ 백준 - 2193 ] 이친수 본문

알고리즘/백준

[ 백준 - 2193 ] 이친수

나복이 2024. 1. 28. 21:57
728x90

https://www.acmicpc.net/problem/2193

 

2193번: 이친수

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

www.acmicpc.net

문제에 대한 설명은 쉽게 이해 되었지만 접근 방식에 대해서는 쉽게 와닿지 않아서 고민 많이 했다.

고민 하는 것 보다 직접 쓰는게 시간이 덜 아까워서 쓰다 보니까 어느정도 감은 잡았다.

질문 게시판을 통해서 힌트도 접했고 풀이 방법이 한개가 아니였다는걸 알게 되었다.


[ 📌 풀이 ]

  • N의 값이 올라갈 때 마다 2가지의 고려 사항이 생긴다
    • 1의 자리가 0
      • 뒤에 0 혹은 1이 와도 이친수가 될 수 있다
    • 1의 자리가 1
      • 뒤에 1이 오면 이친수가 될 수 없다 (= 이전 이친수의 일의 자리가 0인 경우의 수랑 같다)
      • 뒤에 0이 오면 이친수가 될 수 있다

위 조건을 기반으로 식을 만들면

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

일의 자리가 0 = 이전 이친수의 두 조건의 경우의수의 합 ===> 이건 논리적인 이유가 없어서 아쉽다(내가) 그냥 노트에 적다가...
일의 자리가 1 = 이전 이친수의 일의 자리가 0인 경우의 수

[ 경우의 수를 직접 구했다 ]


[ 📌 코드 - Python(1) ]

### DP expression
N = int(input())

dp = [[0] * (N + 1) for _ in range(2)]
dp[0][0], dp[0][1] = 0, 1
dp[1][0], dp[1][1] = 1, 0

for n in range(2, N + 1):
  dp[0][n] = dp[0][n - 1] + dp[1][n - 1]
  dp[1][n] = dp[0][n - 1]

print(dp[0][N - 1] + dp[1][N - 1])

 

[ 📌 코드 - Python(2) ]

일의 자리의 수의 합을 보면 피보나치 수와 같은 특징을 갖기 때문에 피보나치 수열을 구하는 식과 동일하게 풀린다

### Fibonacci sequence
N = int(input())
dp = [0] * (N + 1)
dp[0] = 1
dp[1] = 1

def sol(n):
  if dp[n] != 0:
    return dp[n]

  if n == 1:
    return 1
  
  dp[n] = sol(n - 1) + sol(n - 2)
  return dp[n]

print(sol(N - 1))

[ 📌 결과 - Python  ]

[ Result - Python ]

728x90

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

[ 백준 - 2458 ] 키 순서  (2) 2024.07.22
[ 백준 - 2023 ] 신기한 소수  (0) 2024.01.29
[ 백준 - 14606 ] 피자(Small)  (1) 2024.01.28
[ 백준 - 5014 ] 스타트링크  (1) 2024.01.27
[ 백준 - 1068 ] 트리  (1) 2024.01.27