업로드 한 뒤에 오른쪽 맨위에 돋보기 같은 아이콘(시리얼 모니터)을 클릭하면 아두이노와 통신을 할수 있다.





void setup() {

  Serial.begin(9600);     <---- 9600이 통신 창 맨밑 오른쪽에 9600 보드레이트를 의미

}


void loop() {

  if(Serial.available())  

  {

    Serial.println(Serial.read());  // Serial.println 은 아두이노에서 컴퓨터쪽으로 문자든 숫자든 보냄

  }                                   // Serial.read()는 통신할때 받은 데이터를 그대로 쓴다(아스키코드로 보냄)

}   


loop의 코드를 보면  컴퓨터쪽에서 아두이노로 문자를 주면 그 문자를 아스키코드로 다시 컴퓨터로 보낸다는 뜻 




A를 입력해보겠다.



다음으로 1입력

아두이노에서 컴퓨터로 아스키코드를 보내는것을 알 수 있다.


이것을 이용하면 내가 아두이노로 신호를 보낼때 LED를 키고 끌수 있다.


void setup() {

  Serial.begin(9600);   

  pinMode(13,OUTPUT);

}


// the loop function runs over and over again forever

void loop() {

  if(Serial.available())   // 시리얼 통신할때 읽을 것이 있다면(어떤 입력이 있다면) true 반환

  {

    int swi = Serial.read();           

    if(swi == 49)                    // 1을 입력하면 아스키코드 49로 변환이 됨

    {

      digitalWrite(13,1);

    }

    if(swi == 48)                    // 0을 입력하면 아스키코드 48로 변환이 됨

    {

      digitalWrite(13,0);

    }

  }                                   

}                



























처음으로 할일은 !  아두이노 우노를 사용하기 위해 드라이버를 설치해야 한다.


arduino.cc 이 홈페이지를 일단 들어간다 !



Download를 들어간후 !



windows 사용자는 빨간 네모칸 저걸 다운받으면 될것이고,  Mac 사용자는 밑에 Mac OS X를 다운 받으면 될것이야.


windows 기준으로 90MB 정도


다운을 받고 설치를 완료 하고 난후 아두이노 우노와 컴퓨터를 연결한상태에서 장치관리자를 들어가면



저렇게 뜬다. 여기서 COM8 이란걸 인지하고 있어야 한다.


------------------------------------------------------------------------------------------------------------------------------------------------------------------------

아두이노 우노

1 : 디지털 포트 

이 핀 들은 디지털 입·출력 용으로 digitalRead(), digitalWrite(), 그리고 analogWrite() 명령(함수)들을 가지고 사용할 수 있는 핀들입니다. analogWrite() 명령은 PWM(Pulse With Modulation) 기능을 제공하는 핀들만 사용 가능합니다. 보드를 자세히 살펴 보면 "~" 물결 표시가 되어 있는 핀들이 있을 것입니다. 이 핀들만 analogWrite() 명령을 사용할 수 있습니다.


2 : LED 디지털 13번 핀

디지털 13번 핀과 연결되어 있고, 우노 보드에서 유일하게 ON/OFF 할 수 있는 LED입니다. 스케치 디버깅을 할 때 매우 유용하게 사용할 수 있습니다. 예제 01. Basics에 들어 있는 Blink 스케치도 이 LED를  ON/OFF 시킵니다, 참고로 아두이노 우노 보드를 처음 구입하여 동작 시켰을 때, 보드가 정상인지 이 LED가 주기적으로 깜빡이는 것을 확인하여 확인 할 수 있습니다. 물론 Blink 스케치가 사용되고 있습니다.


3 : 전원 LED

전원(파워: Power)이 들어오고 있다는 것을 알려주는 LED입니다. 보드가 정상인지 판단하는데 유용합니다


4 : ATmega 마이크로컨트롤러
보드의 심장 혹은 두뇌로 Atmel사의 ATmega328 혹은 ATmega328P MCU가 사용됩니다. 28 핀 DIP 타입의 부품이 사용되지만, 간혹 소켓 없이 보드에 바로 부착되는 SMD 용의 여러 모양이 사용될 수 있습니다.

5 : 아날로그 입력 포트

analogRead() 함수를 이용하여 입력 전압의 값들을 0 ~ 1023 사이의 값들로 읽어 들일 수 있는 아날로그 입력 핀들입니다. 아날로그 값들을 1024 등분(분해능)해서 읽어 들일 수 있습니다. analogReference() 함수를 사용하여 입력 전압을 DEFAULT, INTERNAL, EXTERNAL 등으로 설정하여 입력 전압 값을 보다 정확하게 측정할 수 있습니다.


아날로그 입력 핀들은 pinMode() 명령을 사용하여 디지털 입출력 핀들로 사용할 수 있습니다.


6 : 전원 포트

아두이노 우노와 연결하여 사용할 보드나 부품들에 전원을 공급하기 위한 5V와 GND 핀들이며, 3.3V도 사용할 수 있게 핀을 제공하고 있습니다.


7 : 전원 커넥터

USB 포트로부터 전원을 공급 받지만, USB가 연결되지 않았을 경우 전원 컨넥터를 통하여 전원을 공급 받을 수 있습니다. 외부에서 공급하는 전원은 7 ~ 12V 사이의 전압을 사용하여야 합니다. 9V 사용을 권장합니다.


8 : TX와 RX LED들

컴퓨터와 우노 보드 간 통신 상태를 나타내기 위한 LED들입니다. 스케치를 업로드 하거나 시리얼 통신할 때 빠르게 깜빡이는 것을 볼 수 있으며, 보드가 정상으로 동작하는지 판단하는데도 유용합니다.


: USB 포트

아두이노 우노 보드에 전원 공급과 스케치 업로드 그리고 Serial.print() 혹은 Serial.println() 명령으로 컴퓨터와 시리얼 통신을 위한 용도로 사용됩니다.


10 : 리셋 버튼

프로그램 올렸던 내용자체가 다 사라지는게 아니라 그냥 컴퓨터 재시작을 생각 하면 된다.


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





그다음  Arduino를 실행시키면 된다.


그러면 이러한 창이 뜬다.




여기서 중요한게 오른쪽 맨밑에 보면 COM8이라 써있는데, 이게 장치관리자의 COM 넘버와 같아야한다.

처음에 실행시에 아마 장치관리자의 COM넘버와 다를것이다.

이러코롬 바꿔주면 됨.





요기 화면을 보면 setup 과 loop가 설정되어있다.


기본적으로 알아야 할것이. loop와 setup이 둘중에 하나라도 없으면 오류가 난다. 


setup은 초기에 한번만 실행되는것  ,    loop는 setup이후 무한루프를 돌게 되어있다, (아두이노가 죽거나 전원공급이 중단되기 전까지 계속돈다.)


 여기 보면 체크표시 같은건 컴파일하는 것이고,  화살표 모양은 업로드 하는것이다.

업로드 == 컴파일한 소스코드를 아두이노로 올린다.

(업로드할때도 컴파일한 후에 아두이노로 업로드 하기때문에 솔직히 체크표시는 쓸모없다봐도 무방하다.)



기본적인 예제를 하나 연습삼아 해보자면, 파일 -> 예제 -> basics -> blink 를 누르면 


요로코롬 뜬다. 



문장에 대해 설명하자면


pinMode(LED_BUILTIN, OUTPUT);  --> LED_BUILTIN이라는 포트를  출력(OUTPUT)으로 쓸거야 ! 이 말이다.


INPUT OUTPUT INPUTFULL 세가지 모드가 있는데

어느 특정 포트(LED_BUILTIN)를 입력으로 쓸거냐 출력으로 쓸거냐 setup에서 지정해줘야함


digitalWrite(led,HIGH) 켜라            HIGH = ON   ,  LOW = OFF

delay(300);     지금상태로(HIGH)  0.3초  멈춰라   (1초 = 1000 ,  0.3초 = 300)  

digitalWrite(led,LOW) 꺼라

delay(300);    지금상태(LOW)로  0.3초  멈춰라= 300


여기서 OUTPUT , INPUT , HIGH , LOW는 이미 프로그램에서 선언되어있는 상수이다. (밑에 수를 대신 넣어도 똑같은 기능을 함)

             (0)         (1)       (1)      (0)  

LED_BUILTIN 도 13이라는 값을 가지고있는 상수이다.

LED_BUILTIN대신 13을 넣어도 똑같이 작동한다.



이놈을 업로드한다면 2번 LED 디지털 13핀에서 불이 반짝 반짝 0.3초 마다 켜졌다 꺼졌다 할것이다.



위에 문제의 조건에서 초밥의 가짓수 d를 억 단위로 조건을 줄경우 어떻게 풀어야 할까?

  2<= d <= 3000 일때는 인덱스에다 그냥 떄려 박아서 풀었다. 

하지만 억단위로 넘어갈 경우 인덱스를 쓸수 없다.

그래서 직접만든 sort함수로 같은 종류의 반복되는 초밥을 제거 한다음 오름차순으로 바꿔준다.

그리고 오름차순이기 때문에 이분탐색이 가능하므로 시간복잡도를 줄일수 있다.

ex) 입력

8 300000000 4 300000000

70000000 

90000000 

70000000 

300000000 

20000000 

70000000 

90000000 

250000000

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>

#define A 3001

int fish[10 * A], max = 1, realMax;           

int count;

int sort_fish[10 * A], N, d, k, c;

int real_sort_fish[10 * A];

int binary_search_fish[10 * A];

void sort() // 일단 sort_fish[]에 입력받은  fish[]를 반복되면서 오름차순으로 바꾼다.  

{

for (int i = 1; i <= N; i++)

{

for (int j = i + 1; j <= N; j++)

{

if (sort_fish[i] > sort_fish[j])

{

int temp = sort_fish[j];

sort_fish[j] = sort_fish[i];

sort_fish[i] = temp;

}

}

}

for (int i = 1; i <= N; i++)                        // 요것은 sort_fish[]는 오름차순이지만 반복되는것이 있기때문에

{                                                        //  real_sort_fish[]에 반복 되는것을 제거해줬다.

if (real_sort_fish[count] != sort_fish[i])

{

count++;

real_sort_fish[count] = sort_fish[i];

}

}

}


int binary_search(int b) // b는 찾고자 하는 수이고  이분탐색을 이용해 본래 푼 방법의 log N만큼만 시간복잡도를 곱해주는 꼴

{

int left = 1, right = count,mid;

while (1)

{

mid = (left + right) / 2;

if (real_sort_fish[mid] > b)

right = mid;

else

left = mid;

if (real_sort_fish[mid] == b)

{

return mid;

}

if (real_sort_fish[left] == b)

return left;

if (real_sort_fish[right] == b)

return right;

}

}

int main()

{


// N : 회전 초밥 벨트에 놓인 접시의 수    d : 초밥의 가짓수

scanf("%d %d %d %d", &N, &d, &k, &c); // k : 연속해서 먹는 접시의 수    c : 쿠폰 번호 (서비스)


for (int i = 1; i <= N; i++)

{

scanf("%d", &fish[i]);

sort_fish[i] = fish[i];

}

sort(); // real_sort_fish[] 배열을 만듬. <-- 오름차순으로 중복안되게 fish들을 정리해둔것.


int service = binary_search(c);            // 서비스는 어차피 받으므로 무조건 넣어둔다.

binary_search_fish[service]++;            // binary_search_fish[]에는 먹은 초밥들에 대해 저장하는 배열


for (int i = 1; i <= k; i++)                //  첫번째 접시부터 연속되게 먹을수 있는 접시들을 처음에 미리 넣어둔다.

{

int u = binary_search(fish[i]);

binary_search_fish[u]++;

if (binary_search_fish[u] == 1)

max += 1;

}


for (int i = 1; i <= N - 1; i++)                 // 저 위에 문제대로 연속해서 먹는 접시의 수가 4면 일단 위에서 1,2,3,4의 접시는 먹었고 인덱스에 저장됨

{                                                     // 그래서 2,3,4,5로 변경을 해야하는데 이때 인덱스에 1번째 접시를 인덱스에서 빼고 5번째 접시를 인덱스

if (i + k <= N)                           // 에 더하면 됨 .. 요렇게 접시 끝까지 ㄱㄱ 하는데 if문 두개 나눈이유는 작은 test case를 해보면 알겠지만

{                                            //  fish[] 배열을 넘어버리기 때문에 나눠줘야함 ..  해보면 알음 

int u = binary_search(fish[i]);

binary_search_fish[u]--;

if (binary_search_fish[u] == 0)            // 초밥이 빠져나가는 상황에서 만약 0으로 된다면 max값을 -1 한다 (꼬리쪽은 하나씩 없어짐)

max -= 1;


u = binary_search(fish[i + k]);

binary_search_fish[u]++;

if (binary_search_fish[u] == 1)            // 초밥이 더해지는 상황에서 만약 1로 된다면 max값을 +1한다 . (만약 2가된다해도  똑같은

max += 1;                                                                                                                    종류의 초밥은 취급 x)

}


else

{

int t = i + k - N;

int u = binary_search(fish[i]);

binary_search_fish[u]--;

if (binary_search_fish[u] == 0)

max -= 1;


u = binary_search(fish[t]);

binary_search_fish[u]++;

if (binary_search_fish[u] == 1)

max += 1;

}

if (realMax < max)

realMax = max;

}

printf("%d", realMax);

return 0;

}



원래 문제의 입력에서 초밥의 종류들에 한해 곱하기 천만을 한거임 . 그러므로 결과는 같아야한다.



































'알고리즘' 카테고리의 다른 글

(C++) 칵테일 쉐이크 정렬 - (ADL 추가)  (0) 2017.09.26
맨하탄 거리 측정법 과 유클리드 거리 측정법  (0) 2017.01.19
2479번 경로 찾기  (0) 2017.01.11
1699번 제곱수의 합  (0) 2017.01.08
2531번 회전초밥  (0) 2017.01.08

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

인접행렬을 만든뒤에  BFS 돌리면 된다.  BFS문제를 오랜만에 풀어서그런지 너무 코드가 더럽다.


요로코롬 인접행렬만들기





#include<stdio.h>

#define A 1001

char arr[A][31];

int map[A][A], min=1001, N, K, start, stop, Q[A][3],check[A][A],count;

int min_last,root[A],root_count;

void BFS()

{

int bun = 1, work = 0;  // Q[][0] 에는 인접행렬    Q[][1] 에는 이동 횟수

Q[1][0] = start;

while (1)

{

if (bun == work) break;

work++;

for (int i = 1; i <= N; i++)

{

if (map[Q[work][0]][i] == 1 && i != start && check[Q[work][0]][i] == 0)

{

bun++;

check[Q[work][0]][i] = 1;

check[i][Q[work][0]] = 1;

Q[bun][0] = i;

Q[bun][1] = Q[work][1] + 1;

Q[bun][2] = work;

}

if (Q[bun][0] == stop)

{

if (Q[bun][1] < min)

{

min = Q[bun][1];

min_last = bun;

}

}

}

}

}


int main()

{

scanf("%d %d", &N, &K); // N : 코드 수 ,  K : 코드 길이

for (int i = 1; i <= N; i++) // 코드 입력

scanf("%s", &arr[i]);


scanf("%d %d", &start, &stop); // start : 시작위치 , stop : 도착위치 


for (int i = 1; i <= N; i++)

{

for (int j = 1; j <= N; j++)

{

for (int k = 0; k < K; k++)

{

if (arr[i][k] != arr[j][k])

count++;

}

if (count == 1)

map[i][j] = 1;

count = 0;

}

}


BFS();


while (1)

{

root[root_count] = Q[min_last][0];

min_last = Q[min_last][2];

if (min_last == 0)

break;

root_count++;

}


if (min == 1001)

printf("-1");

else

{

for (int i = min; i >= 0; i--)

printf("%d ",root[i]);

}

return 0;

}



------------------------------------------------------------------------------------------------------------------------------------------------------------------------


#include<stdio.h>

#include<math.h>

#define N 100001

int dp[N],basic = 0;


void dynamicP(int a)

{

for (int i = 1; i <= a; i++)

{

int c = pow(basic, 2);                

if (i == pow(basic+1, 2))             //  1 or 4 or 9 or 16같은 제곱수는 바로 1을 넣어버림 . 

{                                            // basic은 1 or 4 or 9를 찾을 때 쓰는 변수이다.

dp[i] = 1;

basic++;

continue;

}

dp[i] = dp[c] + dp[i-c];               // 탐욕 알고리즘처럼 일단 바로바로 최선의 최소개수를 넣고

for (int j = 1; j <= i / 2; j++)

{

if (dp[i] > dp[i - j] + dp[j])            // 탐욕은 각각의 선택에선 최선이지만 전체적으론 최선이 아닐수도 있으니

dp[i] = dp[i - j] + dp[j];        // 조건을 주어 최적의 해를 찾아줌

}

}

}

int main()

{

int a;

scanf("%d",&a);

dynamicP(a);

printf("%d",dp[a]);

return 0;

}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------


#include<stdio.h>

int index[3001],fish[30001],max=1,realMax;            // 인덱스에 연속해서 먹는 초밥의 종류를 저장

int main()

{

int N, d, k, c; // N : 회전 초밥 벨트에 놓인 접시의 수    d : 초밥의 가짓수

scanf("%d %d %d %d",&N,&d,&k,&c); // k : 연속해서 먹는 접시의 수    c : 쿠폰 번호 (서비스)


for (int i = 1; i <= N; i++)

scanf("%d",&fish[i]);


index[c]++;                                       // c 는 service인데 어차피 내가 고르든 안고르든 무조건 먹기때문에 인덱스에 미리 저장

for (int i = 1; i <= k; i++)                    //  처음 초밥부터 연속해서 먹는 접시의 수만큼 인덱스에 넣어줌 

{

index[fish[i]]++;

if (index[fish[i]] == 1)                  //  이 조건문은 이 종류의 초밥을 처음 고른것이다 라는 것을 뜻함  (만약에 인덱스에 2가 들어갈수있는데                                                               //  어차피 같은 종류의 초밥을 2개 먹어도  똑같은 걸 먹었기 때문에 max에 영향 안줌)

max+=1;                           // 그러므로 맥스값 1 

}

for (int i = 1; i <= N-1; i++)                 // 저 위에 문제대로 연속해서 먹는 접시의 수가 4면 일단 위에서 1,2,3,4의 접시는 먹었고 인덱스에 저장됨

{                                                     // 그래서 2,3,4,5로 변경을 해야하는데 이때 인덱스에 1번째 접시를 인덱스에서 빼고 5번째 접시를 인덱스

if (i + k <= N)                           // 에 더하면 됨 .. 요렇게 접시 끝까지 ㄱㄱ 하는데 if문 두개 나눈이유는 작은 test case를 해보면 알겠지만

{                                            //  fish[] 배열을 넘어버리기 때문에 나눠줘야함 ..  해보면 알음 

index[fish[i]]-=1;

if (index[fish[i]] == 0)

max-=1;

index[fish[i + k]]+=1;

if (index[fish[i + k]] == 1)

max+=1;   

            

}

else

{

            int j = i + k - N;

            index[fish[i]]-=1;

if (index[fish[i]] == 0)

max-=1;

index[fish[j]]+=1;

if (index[fish[j]] == 1)

max+=1;

}

        if (realMax < max)

   realMax = max;

}

printf("%d",realMax);

    return 0;

}



영역을 선택후 주석 처리

Ctrl + k + c


영역을 선택후 주석 처리 해제

Ctrl + k + u


자동 정렬

Ctrl + k + f


Ctrl + k 를 먼저 누르고 있는 상태에서  c, u 를 누르면 됨


------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>


#define N 100001

long long dp[N], MAX= -1000, test, SUM;

long long arr[N];


void sum(int a)

{

for (int i = 1; i <= a; i++)

{

SUM += arr[i];

if (MAX < SUM)

MAX = SUM;

if (SUM <= 0)

SUM = 0;

}

}

int main()

{

scanf("%lld", &test);

for (int i = 1; i <= test; i++)

scanf("%lld", &arr[i]);

sum(test);

printf("%lld", MAX);


return 0;

}


내가 푼 방법은

10부터 -1까지 쭈루루룩 더하는데 

더하면서 합이 양수면 계속 돌진 음수면 합을 0으로 초기화후 다시 돌진 

예를 들면  10 + (-4) = 6 이다 그러므로 계속 돌진 !    ->  6 + 3 = 9 이므로 계속 돌진한다..  이렇게 쭈루룩  6 까지 계속 돌진하면 합은 21이다

근데 큰일났다.    -35라는 거대한 음수가 튀어나왔다.    더해보니  21 + (-35) =  -14 라는 음수가 나온것이다.  음수는 나쁜것이니까 버려야한다.

그러므로 0이되었고 여기서 중요한게 21이라는 것을 MAX라는 변수에 넣어놔야함 .

다시 12부터 쭈루루룩 더한다.    12 + 21 = 33(최대값)이 나오고 조건문을 통해 MAX에는 33이 대입된다.   그다음  33 + (-1)을 하고 종료된다.


여기서 주의해야하는게 MAX에다 0을 넣으면안됨.

왜냐하면 입력때 모든 수가 음수일 수가 있다.  

요로코롬  -3 -5 -2 -1 -6  이렇게 다섯가지의 숫자가 입력될수 있는데 여기서 출력은  -1이 출력되야하는데,   MAX 에 0을 넣어놨다면  마지막 출력도 0이 나와버림.   그래서 시작할때  입력할수있는 가장 적은 수인 -1000을 미리 넣어놨다.







'알고리즘 > DP(Dynamic Programming)' 카테고리의 다른 글

파도반 수열 (DP)  (0) 2016.12.21
1로 만들기 (DP)  (0) 2016.12.21
피보나치 수열 2 (DP)  (0) 2016.12.21
피보나치 수열 1 (DP)  (0) 2016.12.21

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>

#define n 101

long long dp[n] = { 0,1,1,1,2,2 };

void podo()

{

for (int i = 6; i <= 100; i++)

{

dp[i] = dp[i - 5] + dp[i - 1];   //  <-- 파도반 수열의 엔진

}

}

int main()

{

podo();

int arr[100] = { 0 };

int test;

scanf("%d",&test);

for (int i = 1; i <= test; i++)

scanf("%d",&arr[i]);

for (int i = 1; i <= test; i++)

printf("%lld\n",dp[arr[i]]);

return 0;

}


파도반 수열은 규칙이 딱 있다. 

dp[i] = dp [i - 5] + dp[i - 1]


예를 들어서  8번째 파도반 수열의 수를 구한다면  3번째 수 + 7번째 수를 더해주면 된다,

'알고리즘 > DP(Dynamic Programming)' 카테고리의 다른 글

연속합 (DP)  (2) 2016.12.22
1로 만들기 (DP)  (0) 2016.12.21
피보나치 수열 2 (DP)  (0) 2016.12.21
피보나치 수열 1 (DP)  (0) 2016.12.21

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>

#define N 1000000

int dp[N];

void fibo(int n)

{

for (int i = 2; i <= n; i++)

{

dp[i] = dp[i - 1] + 1;                                    

if (i % 2 == 0)

{

if (dp[i] > dp[i / 2] + 1)

dp[i] = dp[i / 2] + 1;

}

if (i % 3 == 0)

{

if (dp[i] > dp[i / 3] + 1)

dp[i] = dp[i / 3] + 1;

}

}

}


int main()

{

    int a;

    scanf("%d",&a);

fibo(a);

    printf("%d",dp[a]);

}


DP 에서 bottom - up 으로 풀었다.

DP는 배열에다 메모이제이션하는 방법으로 동일한 방법의 계산을 반복할때, 이전의 값들을 저장하는 방법인데


이 문제를 보면 

입력이 주어졌을때 위의 세가지 규칙들을 이용하여  입력된 수를 1로 최소한의 횟수로 만드는 문제


1에서 1로 만들때 드는 횟수는 당연히 0번   ---> 배열1에는 0삽입


1에서 2로 만들때 드는 방법은 2가지가 있다. 1에서 +1 하는 경우 or 1에서 x2하는 경우  하지만 둘다 횟수 1번으로 동일하기 때문에 --> 배열2에는 1삽입 


1에서 3으로 만들때 드는 방법은 2가지 -->  1에서 x3 하는 경우  or  2에서 +1 하는 경우 ,     이때 1에서 x3 하는 경우는 횟수가 1번이지만 ,  2에서 +1 하는 경우는 횟수가 2번이다.  왜냐하면  1에서 2로 갈때 벌써 횟수1번을 소모했으니 2에서 3으로갈때 총 횟수가 2번이다   

그래서  3으로 만들때 드는 가장 최소한의 횟수는 1번이다.(1에서 x3한 방법)




만약 입력이 11이라면 배열은 요로코롬 만들어질것.





'알고리즘 > DP(Dynamic Programming)' 카테고리의 다른 글

연속합 (DP)  (2) 2016.12.22
파도반 수열 (DP)  (0) 2016.12.21
피보나치 수열 2 (DP)  (0) 2016.12.21
피보나치 수열 1 (DP)  (0) 2016.12.21

+ Recent posts