새소식

Algorithm/코딩테스트

[백준 9625] BABBA (DP)

  • -

문제

 

 

 

풀이

시도1)  메모리초과

K = int(input()) if K==1: print(0,1,end=" ") else: dp = [""]*(K+1) dp[0] = "1" dp[1] = "0" for i in range(2,K+1): dp[i] = dp[i-1] + dp[i-2] final = dp[-1] a_num = final.count("1") b_num = final.count("0") print(a_num,b_num,end=" ")

 

메모리 초과 이유

 

dp 배열을 문자열로 채운 것이 메모리 초과의 이유다. 문자열의 길이는 지수적으로 증가하기 때문에 K가 크면 매우 큰 문자열을 생성하게 되고, 이에 따라 메모리 사용량도 급격히 증가하된다

 

( 참고로, dp 배열은 피보나치 수열의 원리를 이용하여 이전 두 항을 결합하여 현재 항을 생성한다. 이때, dp 배열을 문자열로 채운다면 메모리 사용량도 급격히 증가한다. )

 

 

 

 

시도2) A의 갯수와 B의 갯수를 따로 계산

이를 해결하기 위해, 전체 문자열을 저장하지 않고 1의 개수와 0의 개수를 따로 계산할 수 있다!

K = int(input()) a_count=[0]*(K+1) b_count=[0]*(K+1) a_count[0] = 1 #0번 버튼 눌렀을 때, a의 갯수 b_count[0] = 0 #0번 버튼 눌렀을 때, b의 갯수 a_count[1] = 0 #1번 버튼 눌렀을 때, a의 갯수 b_count[1] = 1 #1번 버튼 눌렀을 때, b의 갯수 for i in range(2,K+1): a_count[i] = a_count[i-1] + a_count[i-2] b_count[i] = b_count[i-1] + b_count[i-2] print(a_count[-1],b_count[-1],end=" ")
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.