jhj967878   4년 전

제가 생각한 방법입니다.

일단 인접한 전구의 색이 같을 경우 그것들을 모두 하나로 봅니다.

1 1 2 2 3 3 3 2 1 1 를 예시로 들겠습니다.

이 경우 1 2 3 2 1 로 만들어서 배열에 저장합니다.

제 코드에서 이 배열이름은 arr 입니다.

그리고 dp 배열을 만들었습니다. dp 배열의 모든 값을 1로 초기화 시켰습니다.

dp 배열의 의미는

dp[0] : arr[0] ~ arr[1] 을 하나의 색깔로 만드는데 필요한 최소 횟수

dp[1] : arr[1] ~ arr[2] 을 하나의 색깔로 만드는데 필요한 최소 횟수

그 이후로는 구간을 넓히며 dp의 값을 계속 갱신해줍니다.

dp[0] : arr[0] ~ arr[2] 을 하나의 색깔로 만드는데 필요한 최소 횟수

dp[1] : arr[1] ~ arr[3] 을 하나의 색깔로 만드는데 필요한 최소 횟수


계속 dp의 값을 바꿔가며

dp[0] : arr[0] ~ arr[4] 을 하나의 색깔로 만드는데 필요한 최소 횟수 

까지 만들어냅니다. 그리고 최종적으로 dp[0] 의 값을 출력합니다.

dp[j] 의 값은 다음과 같은 방식으로 결정합니다.

여기서 i는 구간의 넓이 입니다.

1) dp[j] 와 dp[j+i] 가 같을 경우 : dp[j] 는 dp[j] 와 dp[j+1] 중 작은 값

2) dp[j] 와 dp[j+i] 가 다를 경우 : dp[j] 는 dp[j] 와 dp[j+1] 중 작은 값 + 1

실행 추적을 해보면 다음과 같습니다    

arr = [1,2,3,2,1]

dp = [1,1,1,1]  <- 초기값

dp = [2,1,2]

dp = [2,2]

dp = [2]

전구가 1개인 경우나, 처음부터 색깔이 모두 같은 경우는 0을 출력합니다.

사실 저 코드에서 28번줄이 없어도 0을 출력하지만 혹시나 해서 넣어봤습니다.


0% 에서 바로 틀리는데 반례가 뭔지 모르겠네요..ㅠㅠ

ssongkr   4년 전

6 3

1 2 1 3 2 3

correct answer : 3

your answer : 4

jhj967878   4년 전

감사합니다. 덕분에 마음이 편해졌네요.

댓글을 작성하려면 로그인해야 합니다.