2015년 7월 30일 목요일

SumPrime Algorithm(서로 다른 두수 사이의 소수들의 합)

서로다른 두 자연수 사이의 '소수'들의 합을 구하는 알고리즘이다.

위와 같이 두수 2와 11을 입력하면


그 두수들(2와 11)사이의 소수들(2,3,5,7,11)의 합 (28)이 출력되는 알고리즘이다. 


1. 선행지식

1) 소수를 구한다.
 
   소수들의 합을 구하려면 먼저 그 소수들을 찾아야한다.

   그 소수들을 찾는다면 그 합을 구하는 것은 어렵지 않을것 이다.



2. 처리과정

1)두 수를 입력 받는다.

2)두 수 사이의 소수를 찾는다.

3)'2)'의 과정에서 찾은 소수들을 더한다.


그렇다면 먼저 어떤 수가 소수인지 어떻게 알것인가?

일단 소수(prime)란 어떤수를 자기자신 보다 낮은 수부터 차례대로 하나씩 나눴을때

나머지가 '0'  즉, 나눠지는 수가,  1과 자기 자신 밖에 없는 수를 말한다.

컴퓨터로 구현할때는 count라는 변수를 선언해서.  어떤 value 값을 1부터 자기자신(value)

까지의 값으로 나눴을때 나머지가 0인수(약수)가(value%i ==0) 있을 때 마다 count 를 늘려

준다.

그과정이 끝나고 count를 확인해 봤을 때 count값이 2라면 그 뜻은 나머지가 0인 값(약수)

이 자기자신과 1밖에 없다는 의미이고, 그말은 count=2인 값(value)은 소수라는 걸 알 수있

다.

코드를 보면 이해하기 쉽다.


  위의 함수는 받은 인자의 값이 소수인지 아닌지 판별 하는 함수 코드이다.

소수를 판별 하는 함수를 만들었을때 나머지 과정은 어렵지 않았다.


위 Calculate 함수를 보면 알수 있듯이 작은수(num1)부터 큰수(num2)사이까지의

수들을 하나씩 소수판별하면서 그값이 소수일 경우 SUM 에  계속 더해주기만 하면된다.

이렇게 어렵지않게 두수 사이의 소수들을 알고  그 수들을 합하는 프로그램을 만들어 보았

다. 이 과정에서 BOOL 이라는 용어를 정의하고 함수로 쓰는것, 삼항연산자로 결과값을 반

환해주는 것 등등 여러가지 기술을 익힐수 있엇다.

다음 c파일을 다운받아서 컴파일 해보면 알기 쉽다.

main.c

Coin Change Algorithm(거스름돈 알고리즘)

알고리즘 공부를 시작한게 된 건 컴퓨터적인 사고방식을 키우고자 함이다.


알고리즘을 컴퓨터로 구현하기 위해서는 선행지식과 처리과정을 알고있어야한다.


첫째로 거스름돈 알고리즘을 짜보았다.

거스름돈 알고리즘이란, 우리가 보통 돈을받고 거스름돈을 줄때 가장 큰 단위의 지폐부터

주고 그 다음 큰 단위 그다음 그다음 이런식으로 차례로 화폐를 교환 해주는것을 컴퓨터로

계산하게 만든 알고리즘을 말한다.

예를들어 9700원을 효율적으로 주려면, 5000원 짜리 1장, 1000원짜리 4장, 5원짜리 1개,

100원짜리 2개로 거슬러 주는것이다.



 위와 같이 코인을 입력받으면


이렇게 가장효율적으로 거슬러주는 프로그램이다.


다음은 이 알고리즘을 컴퓨터로 구현하는 과정

1. 선행지식

이 알고리즘을 구현하기 위해 필요한 선행지식으로는 우리는 가장 큰 단위의 화폐부터

작은 단위의 화폐 순으로 계산해 나가야 한다는 선행지식을 알아야한다.



2. 처리과정 [동전(500원, 100원, 50원, 10원) 으로만 바꿔주는 프로그램을 짜봤다]

1) 입력받은돈을 500원으로 나눠 나오는 몫이 500원의 갯수

2) 500원으로 나누고 남은 나머지 에서 100으로 나눠서 나오는 몫이 100 원의 갯수

3) 2)의 과정처럼 100으로 나머지 연산하고 남은 값을 50으로 나오는 몫이 50원의 갯수

4) 3)의 과정과 같이 10원의 갯수를 구한다.

다음은 위의 선행지식과 처리과정을 이용해 코딩을 한것이다.























Calculate 함수를 보면 2.처리과정을 잘 이해할 수있다.




2015년 7월 29일 수요일

Linked List

List Class 를 C 를 이용해 만들어보았다.


(연필로 하나 씩 짜보니 많은 코딩 실력에 향상에 도움을 주었다 . 이렇게 보니 뿌듯ㅎㅎ)

벡터는 자료를 삽입, 추가 , 제거 하는데 모두 시간복잡도가 n이지만,

리스트는 자료 삽입, 추가, 제거가 벡터와 달리 복잡도 1이라는 용이한점을 가진다.

이유는 리스트의 구조에 있다 . 밑의 그림을 보면 리스트를 이해하기 쉽다.

먼저 리스트의 구조는 위의 사진과 같다.

헤드라는 포인터가 가장첫번째 자료를 갖는 Node 형 구조체를 가르킨다.

Node 형 구조체는 다음(next) 과 전(previous) Node 형 구조체와 연결 할 수있는 포인터를 

가지고 있다. 

다음 사진은 새로운 자료(data)를 갖는 구조체를 추가할때의 과정이다.


4라는 자료를 연결하기 위해서 우선, Node*(노드의 포인터형) current 를 선언하고 

Current에 malloc 함수를 통해 Node 형 공간을 할당하고 4라는 값의 Data 를 넣어준다. 

위의 그림과 같다.

그리고 나서 Tail의 다음(Next)포인터를 Current 에 연결 해주고 Current 의 이전(Previous)

또한 Tail 에 연결해 준다. 그리고 Current 의 다음(Next)은 당연히 NULL 값을 준다.

그리고 마지막으로


Tail 을 current 가 가르키는 곳과 같은 곳을 가르키게 이어주면 4라는 값(Data)를 갖는

연결리스트로 만들수있다. 위의 과정은 많은 리스트 클래스 중에 PushBack 과정을

그림으로 그려 본것이다. 


위의 사진은 클래스를 만들때 쓰였던 . 헤더 파일 과 c파일 



2015년 7월 23일 목요일

Vector(c 자료구조 벡터)


2015/07/23 수업 3일차

벡터란 .,, 한마디로 동적배열이다.

오늘 처음으로 c로 클래스를 구현해 보았다.

객체지향이라는 의미를 몸소 느낄수 있는 코딩시간이었다.

c를 객체 지향적으로 만드는일은 매우 번거롭다. 구조체 안에 변수만 넣을 수 있다.

그래서, visual studio에서 구조체 접근 연산자인 '.' 을 찍으면 멤버 변수를 볼 수 있다.

만일 여기에, 함수를 넣을 수 있다면? c++언어의 클래스와 비슷한 기능을 사용할 수 있다.

하지만, c에서는 함수를 구조체에 넣을 수 없기 때문에, 함수 포인터를 사용하였다.

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


벡터의 동작원리



위와 같이,[1,2,3] 인 크기가 3개인 배열이있다.  이때 , 4를 추가로 넣고싶다.


이럴땐, 크기가 기존보다 큰 임시의 배열을 생성한다.

기존의 [1,2,3]을 임시배열에 모두 복사한다.

넣고자하는 값을 임시배열에 추가한다.

기존 배열을 가르키는 포인터가 임시배열을 가르키면, 배열의 크기가 더 커진 상태가 된다.

C/C++은 기존 배열을 메모리 해제  해줘야 하지만, JAVA의 경우는 단순히 이동만 하면 된

다.


위와 같이 , C로 클래스를 만들어 보았다.

vector.c 다운로드

vector.h 다운로드

vector sample 다운로드