동적계획법(Dynamic Programming)

동적계획법

수학과 컴퓨터 공학, 그리고 경제학에서 동적 계획법(動的計劃法, dynamic programming)이란 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법을 말한다. 이것은 부분 문제 반복과 최적 기본 구조를 가지고 있는 알고리즘을 일반적인 방법에 비해 더욱 적은 시간 내에 풀 때 사용한다. -위키백과


조금더 쉽게 설명하자면 작은 문제들을 해결한다음에 이 해결한 결과들을 바탕으로 보다 더큰 문제의 해답을 얻는 방법이다. 

(작은 문제들의 해를 배열에 저장한 다음 그것들을 순환적인 성질을 이용하여 결합해 큰 문제의 해를 구하는 것)


동적계획법의 특징은 다음과 같다.

1.동적계획법은 해를 저장하는 배열을 사용한다 ( Table)

동적계획법이 분할정복( Divide and conquer  : 큰 문제의 해를 쪼개 작은 문제의 해를 구하는 방식)과 구별되는 가장 큰 특징이다.

배열을 이용하면 똑같은 문제의 해를 여러번 구할 필요없이 Table에서 꺼내서 사용할 수 있다.


2. 동적계획법은 순환적인 성질을 이용한다.

동적계획법에서는 점화식 이라는 것을 사용한다. 이점화식은 큰 문제와 작은 문제간의 관계를 나타내는 식이다

큰 문제를 풀기 위해 작은 문제의 대한 해답을 미리 구해놓아야 된다는 뜻이다.

동적계획법이 확실히 유용한 알고리즘 설계기법이긴 하지만 어떤 문제에든지 적용할 수 있는 것은 아니다.

동적계획법이 성립하기 위해서는 최적화 원리가 성립해야 한다.


최적화 원리란?

한 문제에 대한 해가 최적이면 그 문제를 이루는 부분 문제들의 해도 최적이다.(뒤에 문제에서 더자세히 알아보자)


동적계획법 문제를 풀기 위해 다음과 같은 사항들을 고려해야 한다.

1. 문제가 최적화의 원리가 성립하는지 검사(즉 동적 계획법으로 해결할 수 있는지)

2. 부분문제를 정의한다.

3. 우리가 구해야 하는 큰 문제는 어떻게 정의되는지 알아본다.

4. 큰 문제와 작은 문제간의 관계를 찾는다. 즉, 점화식을 구한다.

5. 점화식을 통해 작은 문제들을 어떤 순서로 구해 나갈 것인지를 결정한다.

6. 답을 얻는 과정을 추적하는 방법을 세워야 한다.


다음과 같이 개념만 알았을 때 이해가 잘 안갈수 가 있다. 실제 문제를 풀면서 알아보자.


기업투자
Time Limit : 1000MS

http://jungol.co.kr/problem.php?ctc=03&id=1825 (url 에서 문제 참조)


어떤 투자가가 여러 기업들에게 돈을 투자해서 최대의 이익을 얻고자 한다. 단, 투자는 만원 단위로 할 수 있으며 각 기업은 많이 투자할수록 많은 이익을 투자가에게 돌려주다. 돈을 투자하지 않은 경우는 당연히 얻게 되는 이익도 없다. 예를 들어서, 한 투자가가 4만원을 갖고 두 개의 기업들에 각각 만원 단위로 투자했을 경우 얻을 수 있는 이익은 다음과 같다.


위의 경우 만일, 기업 A에 1만원, 기업 B에 3만원을 투자하는 경우 투자가가 얻는 이익은 14만원(5만원+9만원)이다. 4만원을 투자해서 가장 많은 이익을 얻을 경우 기업 B에만 4만원을 투자하는 경우로서 이때의 이익은 15만원이다. 여기서 투자가는 한 기업에 돈을 나누어 투자할 수는 없다.

투자액이 정해져 있고, 기업의 개수와 각 기업에 투자했을 경우에 얻게 되는 이익이 주어졌을 때 가장 많은 이익을 얻을 수 있는 투자방식과 이때의 이익금을 구하는 프로그램을 작성하라.


첫 줄은 투자 금액과 투자 가능한 기업들의 개수이며, 둘때 줄부터 각 줄은 투자액수 및 각 기업이 투자가에게 주는 이익이다. 단, 총 투자금액은 300만원을 넘지 않으며, 투자 가능한 기업의 개수는 최대 20개이다.

첫 줄에 얻을 수 있는 최대 이익을 출력하고, 둘째 줄에는 각 기업에 투자한 액수를 출력한다.

입력 예
4 2
1 5 1
2 6 5
3 7 9
4 10 15

출력 예
15
0 4


다음은 기업투자 문제이다. 정올 올림피아드 문제인제, 동적계획법의 기법을 적용하지 않으면 도저히 풀 수 없는 문제이다.

다음 문제를 동적계획법을 적용시켜 풀어보자.

다음문제는 제한된 투자금액을 가지고 여러개의 기업에 어떻게 나눠서 투자해야지 가장 최고의 투자효율을 얻을 수 있는지에 대한 문제이다.


여기서 우리가 처음에 알 수 있는 것은 해결해야될 큰 문제이다. 

큰문제는 F[i,j] = 1~i 개의 기업에 j원을 투자 했을 때의 최대 이익  이다.

인제 우리는 이러한 큰 문제를 해결하기 위해서 문제를 작은 문제로 나누어야 한다.

이 나누는 것이 가장 어렵다.

일단 문제를 나눠서 1개의 기업에만 투자를 한다고 생각해보자. 


1개의 기업에 0만원을 투자했을 때 얻을 수 있는 최대이익? 0만원 F[1,0]= 0

1개의 기업에 1만원을 투자 했을 때 얻을 수 있는 최대이익? 5만원 F[1,1]= 5

1개의 기업에 2만원을 투자 했을 때 얻을 수 있는 최대 이익? 6만원 F[1,2]=6

1개의 기업에 3만원을 투자 했을 때 얻을 수 있는 최대 이익? 7만원 F[1,3]=7

1개의 기업에 4만원을 투자 했을 때 얻을 수 있는 최대 이익? 8만원 F[1,4]=8


1개의 기업에 4만원을 투자했을 때 이익은 우리는 표를 이용해서 쉽게 알 수 있다.

그럼인제 2개의 기업을 생각해보자.


2개의 기업에 1만원을 투자했을 때 얻을 수 있는 최대이익?

이것을 구하기 전에 우리는 이전에  1개의 기업에 1만원 투자했을 때 의 최대이익을 알고 있다.

F[1,1]=5 

지금우리가 구하고자하는 것은 2개의 기업에 1억을 투자했을때 F[2,1]=? 이다

1개의 기업이 1억을 투자했을 때의 해를 알고 있으니 2번째 기업에 1만원 투자했을때 (이익 1만원)이랑 비교해보면

우리는 F[2,1]=5라는 것을 알 수 있다.


그럼 인제 2개의 기업에 2만원을 투자 했을때 얻을 수 있는 최대이익을 생각해보자 F[2,2]=?

1개의 기업에 0만원을 투자하고 2번째기업에 2만원을 투자하는 경우 5만원   F[1,0]=0 C[2,2]=5  (C[i,j] 는 i번째 기업에 j원을 투자했을 때 이익)

1개의 기업에 1만원을 투자하고 2번째 기업에 1만원을 투자하는 경우 6만원 F[1,1]=5 C[2,1]=1

1개의 기업에 2만원을 투자하고 2번째 기업에 0만원을 투자하는 경우 6만원 F[1,2]=6 C[2,0]=0 

3개의 경우를 비교해봤을때 2개의 기업에 2만원을 투자 했을 때 얻을 수 있는 최대이익는 6만원이라는걸 알 수 있다. F[2,2]=6


이런식으로 계속 계산할 경우 우리는 F[2,4]까지의 해를 구할 수 있다.

이를 점화식으로 나타내면

F[i,j] = Max {F[i-1,j-k] +C[i,k]} 단, 0<= k<=j) 로 나타낼 수 있다.

F[i,j] = 1~ i번째 기업까지 j만원을 투자 했을 때의 최대이익

C[i,j] = i번째 기업에 j만원을 투자 했을 때의 이익


우리가 방금 했던 F[2,2]를 다시 식으로 풀어보면

F[2,2]= F[1,2-k] +C[2,k] (0<=k<=j) 이다.

우리는 방금 위에서 k가 2만원일 때부터 0만원이 될때 까지 결과값을 봐서

F[2,2]=6이라는것을 알 수 있었다.


우리가 F[2,2]를 구하기 위해서 필요한 데이터는 1개까지의 기업에 0~2만원을 투자했을때의 최대이익 ,F[1,0~2] 이다.

해서 동적계획법에서 말하는 Table을 만들어서 작은 해의 값을 다 저장해 놔야 한다.

이런식으로 2번째 기업에 3만원 투자했을때 4만원 투자했을때 를 전부 구하면 F[2,4] = 2 개의기업에 4만원을 투자했을때의 최대이익까지 알 수 있다. 또 여기서 기업이 더추가된다면 우리는 두번째기업까지의 j액을 투자했을때 최대이익을 다 Table에 저장하고 있기때문에 추가된 3번째 기업의 1~4만원까지의 투자액만 알고 있다면 3번째기업까지 F[3,4] 완성할 수 있다.


최종 점화식은 F[i,j] = (if i=0) 0

  (else) Max {F[i-1,j-k] +C[i,k]} 단, 0<= k<=j) 이다.




알고리즘 문제를 푸는데 알면 유용한 수학 Link

Algospot!!을 보다가 아주 좋은 페이지를 발견

https://algospot.com/wiki/read/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EB%8C%80%ED%9A%8C%EC%97%90_%ED%95%84%EC%9A%94%ED%95%9C_%EC%88%98%ED%95%99


알고스팟에서 문제를 많이 푸시는 분이 정리한 수학 위키페이진데

문제에서 나올 수 있는 수학이론에 대해서 잘 정리되어있다.

저런 수학이론이 포함된 문제는 알지 못하면 풀 수가 없다.


예전에 풀었던 문제중에 최대공약수 최소공배수를 구하는 간단한 문제였는데 유클리드 호제법으로 풀지 않으면

타임리미트가 걸리는 문제를 풀었던 기억이 있다. 꼭 공부하도록 하자

'Programming > 알고리즘&자료구조' 카테고리의 다른 글

동적계획법(Dynamic Programming)  (3) 2014.07.19
알고리즘(Algorithm)이란?  (0) 2014.06.25

URL

Programming/AlgoSpot 2014. 7. 1. 00:30

문제 정보

문제

URI (Uniform Resource Identifier) is a compact string used to identify or name resources on the Internet. Some examples of URI are below:

  • http://icpc.baylor.edu.cn/
  • mailto:foo@bar.org
  • ftp://127.0.0.1/pub/linux
  • readme.txt

When transmitting *URI*s through the Internet, we escape some special characters in *URI*s with percent-encoding. Percent-encoding encodes an ASCII character into a percent sign ("%") followed by a two-digit Hexadecimal representation of the ASCII number. The other characters are not touched in the encoding process. The following table shows the special characters and their corresponding encodings:

Special CharacterEncoded String
" "%20
"!"%21
"$"%24
"%"%25
"("%28
")"%29
"*"%2a

Note that the quotes are for clarity only.

Write a program which reverses this process.

입력

The first line of the input file will contain the number of test cases C (1C100). The following Clines will each contain a test case — which is the percent-encoded URI. Their length will be at most 80.

출력

Print one line for each test cases — the decoded original URI.

예제 입력

2
Happy%20Joy%20Joy%21
http://algospot.com/%2a

예제 출력

Happy Joy Joy!
http://algospot.com/*


210583URIwowrupicpp968B정답2ms


1.문제설명
URL

2.알고리즘
string 변환

3.소스코드
#include <stdio.h>
#include <string.h>

int main(void)
{
int Case, i;
char str[81]={0,};
scanf("%d", &Case);

while(Case--)
{
scanf("%s", str);

for(i=0;i<strlen(str);i++)
{
if(str[i]=='%'&&str[i+1]=='2')
{
if(str[i+2]=='0')
{
putchar(' ');
i+=2;
continue;
}
else if(str[i+2]=='1')
{
putchar('!');
i+=2;
continue;
}
else if(str[i+2]=='4')
{
putchar('$');
i+=2;
continue;
}
else if(str[i+2]=='5')
{
putchar('%');
i+=2;
continue;
}
else if(str[i+2]=='8')
{
putchar('(');
i+=2;
continue;
}
else if(str[i+2]=='9')
{
putchar(')');
i+=2;
continue;
}
else if(str[i+2]=='a')
{
putchar('*');
i+=2;
continue;
}

}
putchar(str[i]);
}
putchar('\n');
memset(str, 0,sizeof(str));
}

return 0;
}

4.문제후기
초! 초급문제 알고스팟 초심자용문제에 있길래 풀어봤는데 
역시 초심자용
제출횟수가 2672인데 정답횟수가 934(34%)길래 그래도 풀어볼만하겠다 싶었는데 너무쉬었음


'Programming > AlgoSpot' 카테고리의 다른 글

등산로  (0) 2014.05.28

알고리즘(Algorithm)이란?

처음에 내가 프로그래밍에 재미를 느끼게 된 것이 알고리즘(Algorithm) 때문이 었다.

군대 제대후 공부를 하기 위해 처음 들어간 동아리가 ACM-ICPC 대회를 준비하는 동아리였고 C언어를 처음 배우고

ACM 문제를 접하며 프로그래밍에 재미를 느꼈다. 

그후 멤버십 생활 현재 회사에 들어와서까지 어딜가나 알고리즘은 항상 중요시 생각 되는부분이었다.

C언어를 배우고 처음 접한게 ACM문제 였고 나름 동아리 생활을 통해 대회도 나가보고 멤버십에서 시험도 많이 봤지만 

문제를 엄청 잘 풀지는 못하였다. 

문제를 많이 풀어보는 것도 코드를 잘 짜는 것도, 중요하지만 알고리즘에 원론적인 내용과 이론적인 부분을 잘 알지 못한 까닭이라고 생각한다.

그래서 지금부터 알고리즘에 대한 원론적인 내용부터 여러가지 이론들까지 처음부터 꼼꼼하게 다시 공부해보려고 한다.



1.알고리즘

-어떠한 문제를 해결하기 위한 여러 동작들의 유한한 모임

위키백과에 나와있는 알고리즘에 대한 내용이다. 

여기서 중요한 것은 어떠한 문제를 해결하기 위한  여러 동작들의 유한한 모임이란것 이다.

내가 지금까지 생각했던 것과는 약간 틀리다. 나는 알고리즘의 정의는  어떠한 문제를 해결하기 위한 최선,최적의 방법이라고 생각하고 있었지만

실제 정의는 저것이다.


-알고리즘의 조건

      • 입력 : 외부에서 제공되는 자료가 0개 이상 존재한다.
      • 출력 : 적어도 1개 이상의 결과를 내어야 한다.
      • 명확성 : 수행 과정은 명확하고 모호하지 않은 명령어로 구성되어야 한다.
      • 유한성(종결성) : 유한 번의 명령어를 수행 후(유한 시간 내)에 종료한다.
      • 효율성 : 모든 과정은 명백하게 실행 가능(검증 가능)한 것이어야 한다.


다음은 알고리즘의 조건이다. 위의 조건만 만족하면 알고리즘이라 정의할 수 있겠다.

물론 조건에 없다고 알고리즘이 문제를 해결하기만 하면 되는 것은 아닌거 같다

좀더 성능이 좋은 알고리즘은 수행시간이 짧아야하고 효율적이어야 한다.


2.알고리즘의 성능 

알고리즘의 성능이란 같은 알고리즘이라도 계산속도가 좀더 빠르고 메모리가 적게드는 것을 말한다.

요즘에 컴퓨터가 많이 발전해서 연산속도가 빠르고 메모리가 크지만 그렇다고 계산속도와 메모리를 생각하지 않고 프로그램을 짜면 안된다.

그럼 무조건 빠른것만 중요할까?

다음 두개의 코드를 비교해보자

                             


다음은 똑같이 Hello를 10번찍는 두개의 프로그램중 어떤 것이 더 성능이 좋은 프로그램일까?

누가봐도 2번째 코드가 더 좋은 코드일 것이다. 

하지만 연산속도로만 보면 첫번째 코드가 더 빠르다 for문 연산이 없기때문에

그렇다면 왜 2번째 코드가 더 좋은 코드일까?

10번찍엇을 때를 말고 수억번을 찍었을 때를 생각해보면 물론 코드의 간결성도 있고 여러가지 이유가 있지만 제외하고 메모리만 생각해보았을때

실제 명령어가 수억줄이나 메모리에 코드섹션에 들어가기 때문에 

훨씬더 무거운 프로그램이 될 것이다.



이토록 성능이좋은, 보다 효율적인 알고리즘이란 시작하여 결과가 나올 때까지의 실행시간이 짧으면서 메모리의 자원을 덜 사용하는 알고리즘이다.

물론 알고리즘에서 실행 시간이 메모리 공간보다 훨씬 더 중요하게 생각되지만 메모리를 적게 쓰는 것도 생각해야 할 부분이다.


-알고리즘의 분석기준

  • 정확성 : 적당한 입력에 대해서 유한 시간내에 올바른 답을 산출하는가를 판단.
  • 작업량 : 전체 알고리즘에서 수행되는 가장 중요한 연산들만으로 작업량을 측정. 해결하고자 하는 문제의 중요 연산이 여러개인 경우에는 각각의 중요 연산들의 합으로 간주하거나 중요 연산들에 가중치를 두어 계산
  • 기억 장소 사용량
  • 최적성 :그 알고리즘보다 더 적은 중요 연산을 수행하는 알고리즘은 없는가? 최적이란 가장 '잘 알려진' 이 아니라 '가장 좋은'의 의미이다
  • 복잡도.


3.알고리즘의 복잡도 분석 방법 

여러가지 알고리즘 중에서 제일 효율적인 하나를 선택해야 하는 경우에, 직접 구현하지 않고서도 대략적으로 알고리즘의 효율성을 비교할 수 있는 방법이

알고리즘의 복잡도 분석(complexity analysis)이다.

알고리즘의 복잡도 분석은 구현하지 않고도 모든 입력을 고려하는 방법이고, 실행하드웨어나 소프트웨어 환경과는 관계없이 알고리즘의 효율성을 평가할 수 있다.


알고리즘의 분석에서는 2가지 측면을 고려할수 있다

 1.시간복잡도(time complexity)

 2.공간복잡도(space complexity)

 대게 알고리즘의 복잡도를 이야기할 때는 시간복잡도를 말한다. 이유는 위에서 언급했듯이 알고리즘은 시간을 더 중요시 생각하기 때문이다.


1)시간복잡도(time complexity)

-시간 복잡도는 알고리즘의 절대적인 실행 시간을 나타내는 것이 아니라 알고리즘을 이루고 있는 연산들이 몇 번이나 실행되는지를 

숫자로 표시한다.

-연산의 실행횟수는 입력의 개수 n에 따라게 변하게 된다. 연산의 개수를 입력의 개수 n의 함수로 나타낸 것을 시간 복잡도 함수라 하고

 T(n)이라고 표기한다.


Ex) n*n을 계산해보자

A는  그냥 n*n으로 계산한 방법

B는  n을 n번 더한 방법

C는 1을 n*n번 더한 방법이다.

       

       위의 3가지 알고리즘 중에서 가장 효율적인 알고리즘을 선택하기 위하여, 알고리즘을 구현하지 않고 알고리즘 분석

       기법을 통해 실행속도를 예측해보자 

       예를 들어 입력이 10이라고 했을 때 A는 2번 B는 21번 C=201번을 연산한다.(for 문의 연산을 제외했을 때) n의 숫자가 커지면 커질수록 연산의 횟수는

       더크게 차이나여 알고리즘 실행속도는 더 크게 차이난다.


2) 빅오 표기법

시간 복잡도 함수에서 불필요한 정보를 제거하여 알고리즘 분석을 쉽게 할 목적으로 시간 복잡도를 표시하는 방법을 

빅오 표기법(big-oh notation)이라고 한다.

빅오 표기법은 n의 값에 따른 함수의 상한 값을 나타내는 방법이다. 이론은 빅오표기법의 정의를 보면 알 수 있지만

귀찮으니 생략한다.

시간복잡도 함수가 f(n)=5  이면 O(1)이다.

시간복잡도 함수가 2n+1이면 O(n)이다.

시간복잡도 함수가 f(n) = 3n^+100 이면 O(n^)이다.

빅오 표기법을 사용하면 시간 복잡도 함수의 증가에 많이 기여하지 못하는 항을 생략함으로써 시간 복잡도를 간단한게 표시할 수 있다.

빅오표기법을 얻는 간단한 방법은 최고차 항만 남기고 다른 항들과 상수를 버리는것이다. 궁극적으로 최고차 항의 계수도 버리고 최고차 항의 

차수만을 사용한다. 

이처럼 최고차 항만 남기고 다른 항들과 상수를 버리는 것은 다른 항들과 상수는 시간 복잡도 함수의 증가에 많이 기여하지 못한다는 뜻이다

입력 값이 작을 때는 영향을 끼칠 수 있겠지만 입력값이 커지면 커질수록 다른항들이나 상수가 실행속도에 영향을 미치는 부분은 미비하다.


많이 쓰이는 빅오 표기법 (실행시간이 빠른 순)

  • O(1) : 입력 자료의 수에 관계없이 일정한 실행 시간을 갖는 알고리즘 (상수형)
  • O(log N) : 입력 자료의 크기가 N일경우 log2N 번만큼의 수행시간을 가진다. (로그형)
  • O(N) : 입력 자료의 크기가 N일경우 N 번만큼의 수행시간을 가진다. (선형)
  • O(N log N) : 입력 자료의 크기가 N일경우 N*(log2N) 번만큼의 수행시간을 가진다. (선형로그형)
  • O(N2) : 입력 자료의 크기가 N일경우 N2 번만큼의 수행시간을 가진다. (2차형)
  • O(N3) : 입력 자료의 크기가 N일경우 N3 번만큼의 수행시간을 가진다. (3차형)
  • O(2n) : 입력 자료의 크기가 N일경우 2N 번만큼의 수행시간을 가진다. (지수형)
  • O(n!) : 입력 자료의 크기가 N일경우 n*(n-1)*(n-2)... * 1(n!) 번만큼의 수행시간을 가진다. ex)외판원 문제(TSP)의 기본적인 해법(팩토리얼형)


빅오표기법은 최소 차수를 상한으로 표시한 표기법이다

이위에도 함수를 하한으로 표시하는 빅오메가 표기법 

동일한 함수로 상한과 하한을 만들수 있는 빅세타 표기법 등이 있다


3개의 표기법 중에 가장 정밀한 것은 빅세타 표기법이다 (상한과 하한 )

그러나 통상적으로 빅오 표기법을 많이 사용한다. 단, 빅오 표기법에서는 최소 차수로 상한을 표시한다고 가정한다.














Visual Studio 2012 를 VMware와 연동하기 !(Kernel Debugging) [출처] Visual Studio 2012 를 VMware와 연동하기 !(Kernel Debugging)|작성자 naneunja

Programming/DeviceDriver 2014. 5. 28. 01:36



1.타겟 가상머신 설정하기(VMware 기준)


2.호스트 컴퓨터 설정하기


3.디버깅 시작하기




1.타겟 가상머신 설정하기(VMware 기준)


먼저 VMware에 하드웨어적인 설정을 해주어야 합니다.

바로 호스트와 가상머신 사이에 Serial Cable로 연결해주는 과정입니다.(가상으로!)





위 그림 처럼 Serial Port를 설정해주시고,

꼭 " I/O mode ---> Yield CPU on poll " 이 부분을 체크해주세요.

(게스트 운영체제가 폴링 모드에서 serial port를 사용하도록 허용함. 폴링(polling)이란 프로그램에 의한 입출력(PIO:Programmed I/O)로서, 중앙 처리가 입출력장치의 입출력 작업 발생여부를 지속적으로 감시하는 것으로서 입출력 제어가 이루어지는데, 그래서 폴링이라고 부른다고 한다.... 아무튼.. 디버깅을 위해서는 이부분을 체크해야합니다.)







어떤 미디어를 통해 시리얼 포트를 접근할 것인가? 라는 질문에는 '이름이 지정된, 파이프(Output to named pipe)'를 선택합니다.






pipe 이름을 지정할 수 있는 칸에는 "  \\.\pipe\임의이름  " 으로 지정합니다. 
(현제 PC의 pipe 로서 com_1 이라는 포트를 이름으로 지정하여 열겠다는 의미라고 합니다..)
 
" This end is the server "  는 pipe의 한쪽 끝이 디버그 정보를 수집하는 VMware가 설치된 PC라는 의미....
" The other end is an application " 한쪽 끝에는 그 정보를.... 어플리케이션에서 받는 다는의미..?(정확히 어떤 뜻인지는 모르겟지만. 이와같이 설정해야한다.)
 
 여기 까지 해서 Serial Port를 추가 해주고, 다음으로는 가상머신의 OS 에 디버깅 설정을 해주어야 합니다.
 
가상머신을 켜고, 다음과 같이 설정합니다.






'Window + R' 실행에서 "msconfig"를 실행하고, 부팅 탭에서 고급옵션으로 가서, 다음과 같이 설정합니다.
 
 
그리고 재부팅을 하면 됩니다.
 
여기까지 가상머신 설정이 완료 되었습니다.






2.호스트 컴퓨터 설정하기

다음은 호스트컴퓨터 설정을 해야 합니다. 위에서도 말씀드렸듣이, WinDbg와 Visual Studio가 통합 되었기 때문에, Visual Stduio에서 설정을 해야 합니다.



DeviceDriver 프로젝트에서 " 속성 > 디버깅 > Configure " 에서 디버깅을 위한 컴퓨터 속성을 선택합니다.



 

Computer name : 임의로 컴퓨터 이름을 주시면되구요.


각 옵션에 대해서는 다음과 같습니다.

Provision computer and automatically configure debuggers(컴퓨터 프로비전 및 디버거 자동 구성) : 대상 컴퓨터에서 Windows 8을 실행 중이고 대상 컴퓨터에 네트워크 디버깅을 지원하는 네트워크 어댑터가 있는 경우 ( ※ 이 옵션은 네트워크 디버깅을 위한 포트 번호를 자동으로 만들며 개발자가 포트 번호를 변경할 수 없습니다. 회사에서 네트워크 디버깅에 사용할 수 있는 포트 번호를 제한하는 경우 두 번째 옵션을 선택합니다)

Provision computer and choose debugger settings(컴퓨터 프로비전 및 디버거 설정 선택) : 대상 컴퓨터에서 Windows 8 미만인 Windows 버전을 실행 중인 경우 또는 다른 유형의 디버깅 연결 중 하나(USB, 1394, 직렬)를 사용하려는 경우 이 옵션을 사용한다. 이 옵션을 사용하면 디버깅 연결 형식을 선택할 수 있으며, 네트워크 디버깅 연결을 선택할 경우 포트번호와 암호화 키를 선택할 수 있다.

Manually configure debuggers and do not provision(디버거 수동 구성 및 프로비전 안 함) : 디버깅을 위해 호스트 컴퓨터에 Visual Studio를 구성하려고 핮니만 대상 컴퓨터를 디버깅하지 않으려는 경우 선택한다. 이 옵션은 대상 컴퓨터에 대한 디버깅을 구성하지 않아. 대상 컴퓨터에서 직접 bcdedit(여기의 경우에는 mscofig를 통해 설정)를 사용하여 대상 컴퓨터에서 디버깅을 구성해야한다.

 가상머신 연결에는 세번째에 있는 "Manually configure debuggers and do not provision"을 선택합니다,

 

이다음으로는 연결설정을 해줘야 합니다.




VMware 에서 저희는 Serial 통신으로 설정했기 때문에,

Connection Type : Serial 을 선택하고.

 

msconfig에서 설정했던 'Baud Rate, Target Port'를 지정합니다.

 

그리고 'Pipe, Reconnect' 체크하고,

 

Pipe name 에는 VMware에서 serial설정을 했던 이름을 그대로 써줍니다.(스크롤을 올려보면 나옵니다)



2.호스트 컴퓨터 설정하기


자 이제 모든 설정이 완료 되었습니다.!! 

이제 디버깅을 시작하기만 하면 됩니다.^




메뉴의 "도구 > 프로세스에 연결" 을 선택합니다.




" Windows Kernel Mode Debugger "를 선택하시고, 방금 연결설정을 했다면 "Computer"라고 이름이 있을 것입니다. 선택하시고,~

연결!! 을 누르면 됩니다.





짜잔~~  하하.. 

이렇게 이쁘게 WinDbg가 Visual Studio 안으로 쏘~~옥 들어왔습니다..

 

아직 써보질 않아서, 훨씬 편한지 어쩐지는 모르겠지만.. 호호. 신기하군요..

저처럼. Visual Studio 2012 와 가상머신을 연동해서 드라이버를 위한 Kernel Debugging 을 하려고 하시는데,, 통 인터넷에 자료가 없어서. 삽질을 하고 계실 또다른 초보 개발자분들위 위해.. 이글을 받칩니다. 


 2012 를 VMware와 연동하기 !(Kernel Debugging)|작성자 naneunja 

원문 URL : http://sseoty.blog.me/90174028380

 이글은 제가 존경하고 또 너무 좋아하는 형이 쓴글을 퍼온 것입니다. 예전에 Device Driver 프로젝트를 했었을 때  저도 VisualStudio2012로 편하게 DeviceDriver를 빌드하고 디버깅 할 수 있었던거 같네요. 이환경데로 하면 F7키 한방에 드라이버 sys파일이 생성이되고 디버깅도 편하게 비쥬얼스튜디오 단축기로 중단점 걸어가면서 할 수 있습니다. 

감사하는 마음을 가집시다^^





등산로

Programming/AlgoSpot 2014. 5. 28. 00:57

문제 정보

문제

모르도르 지방의 아름다운 경치를 한 눈에 볼 수 있는 명산 오로드루인에는 길기로 유명한 등산로가 있습니다. 이 등산로는 산등성이를 따라 오르락내리락하며 구성되어 있지요. 이 등산로는 너무 길기 때문에 특수 장비(예를 들면, 절대반지 등)를 갖춘 사람이 아니라면 처음부터 끝까지 정복하기가 힘이 듭니다. 관광 자원 개척을 위해 이 등산로 중 몇 군데를 별도의 등산로로 개방하려고 합니다.

등산로에는 100미터 간격으로 표지판이 있는데, 각 표지판의 해발 고도를 측정한 자료가 있습니다. 이 때 등산로의 난이도는 등산로를 가다 만나는 표지판 중 최대 해발 고도와 최저 해발 고도의 차이입니다. 개방을 검토하고 있는 등산로의 일부가 주어질 때, 각 부분의 난이도를 계산하는 프로그램을 작성하세요.

입력

입력의 첫 줄에는 테스트 케이스의 수 C (1 <= C <= 30) 가 주어집니다. 각 테스트 케이스의 첫 줄에는 원래 등산로에 있는 표지판의 수 N (1 <= N <= 100,000)과 개방을 고려하고 있는 등산로의 수 Q (1 <= Q <= 10,000)가 주어집니다. 그 다음 줄에 N 개의 정수로 각 표지판의 해발 고도 hi 가 순서대로 주어집니다. (0 <= hi <= 20,000) 각 표지판은 입력에 주어지는 순서대로 0 번부터 N-1 번까지 번호가 매겨져 있습니다. 그 다음 Q 줄에 각 2개의 정수로 개방을 고려하고 있는 등산로의 첫 번째 표지판과 마지막 표지판의 번호 a , b (0 <= a <= b < N) 가 주어집니다.

입력 데이터의 양이 많으니 가능한 빠른 입출력 방법을 사용하시기 바랍니다.

출력

한 줄에 하나씩 개방을 고려하고 있는 각 등산로의 난이도를 출력합니다.

예제 입력

2
3 1
1 2 3
0 2
10 4
3 9 5 6 10 8 7 1 2 4 
1 6
4 7
9 9
5 8

예제 출력

2
5
9
0
7


1.문제설명
개방하려고 하는 등산로의 난이도를 구하는 문제

2.알고리즘
Max-Min

3.소스코드
#include <stdio.h>

int GetLevel(int *pArr, int start, int end)
{
int Max, Min, i;
Max=pArr[start]; Min=pArr[start];

for(i=start+1;i<=end;i++)
{
if(pArr[i]>Max)
Max=pArr[i];
if(pArr[i]<Min)
Min=pArr[i];
}

return Max-Min;
}

int main(void)
{
int Case;
int Mountain_Way,Sign_Num,Start_Num,End_Num;
int Arr[100000]={0,};

int i;

scanf("%d", &Case);
while(Case--)
{
scanf("%d %d", &Sign_Num, &Mountain_Way);
for(i=0;i<Sign_Num;i++)
{
scanf("%d", &Arr[i]);
}
while(Mountain_Way--)
{
scanf("%d %d", &Start_Num, &End_Num);
printf("%d\n", GetLevel(Arr,Start_Num, End_Num));
}

}


return 0;
}

4.문제후기
오랜만에 문제를 풀어본다. 회사에서  AlgoSpot으로 Study를 한다길래 
로그인 하고 쉬운문제를 풀어보았는데 ACM과는 다르게 문제가 한글로 되어있어 좋은거 같다. 꾸준히 풀어봐야겠다


'Programming > AlgoSpot' 카테고리의 다른 글

URL  (0) 2014.07.01