2449번 - 전구
제가 생각한 방법입니다.
일단 인접한 전구의 색이 같을 경우 그것들을 모두 하나로 봅니다.
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% 에서 바로 틀리는데 반례가 뭔지 모르겠네요..ㅠㅠ
6 3
1 2 1 3 2 3
correct answer : 3
your answer : 4
감사합니다. 덕분에 마음이 편해졌네요.
댓글을 작성하려면 로그인해야 합니다.
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% 에서 바로 틀리는데 반례가 뭔지 모르겠네요..ㅠㅠ