티스토리 뷰

728x90

programmers.co.kr/learn/courses/30/lessons/12971

 

코딩테스트 연습 - 스티커 모으기(2)

N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다. 원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록

programmers.co.kr

- 접근법

 

사실 이 문제는 간단한 원형 다이나믹 문제이다.

처음 인덱스의 정보가 마지막 인덱스의 정보에 영향을 끼친다는 것을 배제하고 문제를 다시보면

"연속하지 않는 숫자들의 최대합" 으로 볼 수 있고 여기에 처음 인덱스의 숫자를 선택했을 때와 선택하지 않았을 때 중 큰 값이 문제의 정답이 된다.

따라서 "연속하지 않는 숫자들의 최대합"은 1차원 배열의 DP로 쉽게 생각해볼 수 있다.

점화식을 간단히 생각해보면 Dy[i]= ( Dy[i-2]+현재숫자 , Dy[i-1] ) 중 큰 값 으로 생각해볼 수 있다.

그리고 다시 배제하였던 원형 다이나믹을 고려해본다면 처음 인덱스의 숫자를 선택했다면 Dy 배열에 정답은 Dy[N-2]에 있을 것이고 처음 인덱스의 숫자를 선택하지 않았다면 정답은 Dy[N-1]에 있을 것이다. (N-1은 인덱스가 0부터 시작하므로)


- 유사문제

www.acmicpc.net/problem/17404

 

17404번: RGB거리 2

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

대표적인 원형다이나믹 문제.

단 각 인덱스에서 선택할 수 있는 옵션이 3가지있다는 점이 차이점이다.

 

programmers.co.kr/learn/courses/30/lessons/42897

 

코딩테스트 연습 - 도둑질

도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다. 각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한

programmers.co.kr

이 문제와 100% 같다고 볼 수 있다.


-소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
using namespace std;
#define MAXI(A,B) A>B ? A : B
int Dy[100010];
int N;
int re(int idx) {
    if(idx<0return 100002;
    return idx;
}
int Dynamic(int picked,vector<int> sticker) {
    Dy[0]=picked;
    for(int i=1;i<N;i++) {
        Dy[i]=MAXI(Dy[i-1],Dy[re(i-2)]+sticker[i]);
    }
    if(picked==0return Dy[N-1];
    return Dy[N-2];
}
int solution(vector<int> sticker)
{
    int answer = 0;
    N=sticker.size();
    if(N==1return sticker[0];
    answer=Dynamic(sticker[0],sticker);
    answer=MAXI(answer,Dynamic(0,sticker));
    return answer;
}
cs
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함