2015년 8월 18일 화요일

Delete Coment(주석 제거 프로그램).

간단한 주석을 제거하는 프로그램을 구현해 보았다. 프로그램 하다보면 '//' 같은 한줄 주석  '/*' 같은 여러줄 주석을 많이 사용한다. 이런 주석이 달린 파일을 받아서 주석을 제거한 파일을 만들어 보았다. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stddef.h> #define IN 0 // in 일때는 주석안에 들어갔을때 #define OUT 1 // out 일때는 주석밖으로 나왔을때 typedef unsigned int UINT; char* AllocateInput(FILE*fp, UINT size); // 파일에 있는 문자전체를 메모리로 복사하는 함수 void DeleteComent(char*arr, UINT size, char*...

2015년 8월 7일 금요일

Divide and Conquer(분할 정복)

분할 정복이란 컴퓨터가 큰 데이터를 한번에 처리할 수 없기 때문에,  작은 단위로 나누어 데이터나 문제를 해결(정복) 하는 알고리즘이다. 일단 이론은 다음그림을 보면       이해가 쉽다.  출처 http://www.icckk.com/  자그럼 다음 과 같이 배열이 있다.  과연 연속된 수들중 가장 큰 연속을 찾고 싶을 때 어떻게 할것인가 ?   정답은 4 -1 3 2 4 -7 10 2 로 연속된 배열이가장 큰배열이다. 이것을 분할 정복을 통해 찾아보자. 우선 그림처럼 가장 작은단위 까지 분할 하고 그수들 중 큰 값을 가져와 서로 비교한다. 재귀 함수를 이용해 왼쪽 오른쪽 가운데  값들의 연속을 작은단위부터 가져와 비교하는 것이다.  위그림과...

C language 2048_game

2048 게임을 작성해보았다. 2048게임이란 같은숫자를 계속 더해나가서 2048 이라는 블럭이 나오면 승리하는게임이다. 2048을 만들기전에 화면에 숫자들이 가득차서 더이상 움직일 수 없다면 게임에 패배한다. 간단한 함수 몇개 만 소개하자. 먼저 입력을 받는 함수를 짜기 전에 enum 으로 왼쪽 오른쪽 위쪽 아래쪽을 초기화 선언 해준다. 먼저 키보드 방향키(→,←,↑,↓)를  입력 받는 함수다. 방향키는 합성 코드로 찾아보면 두개의 수를 입력을 받는다. 왼쪽(224,75) 오른쪽(224,77)  위쪽(224,72) 아래쪽 (224,80) 이렇게 입력이 들어온다 그러므로 처음 224 가 들어올때까지 키보드 입력을 받고 다음 입력은 각각 방향키 고유의 숫자들을 받아준다. 각각 의 리턴값을 모와서 각 방향에따라 다른 함수를 호출해주는 함수. 위...

2015년 8월 3일 월요일

Baseball Game(베이스볼, 야구 게임)

어렸을때 하던 베이스볼 게임을 간단히 코딩해 보았다. 베이스볼 게임이란, 4자리 숫자가 있으면, 그  숫자와 자릿수를 같이 맞추는 게임이다. 만약 숫자만 맞고 자리가 다르다면 ball,  숫자와 자릿수가 같으면 strike 이다. 간단히 한번의 진행에 strike 와 ball 의 갯수만 보여주는 코드를 작성해 보았다.  1. 배경지식 숫자와 자리가 같으면 strike 를 카운트 같은 숫자만 있다면 ball 을 카운트 둘다 아니면 아무것도 아님; 2. 처리과정   1) 정답인 숫자 4개를 배열에 입력 받는다. (배열 answer)   2) 도전해볼 4개의 숫자를 입력할 배열을 만들어 입력받는다. (배열 in)    3) 반복문을 돌린다(i,j)        ...

Classify Number(숫자 구분하기)

이 코드 내용은 갯수를 입력하고, 입력받은 갯수만큼 숫자를 입력한다. 그리고 입력받은 숫자들 중에 홀수, 짝수, 양수, 음수의 갯수가 몇개있는지 보여주는 간단한 알고리즘이다. 위와 같이 갯수를 입력한다. 갯수 만큼 원하는 숫자를 입력한다. 입력한 숫자들중에서 혹수, 짝수, 양수, 음수의 갯수를 출력한다. 1. 배경지식 음수, 양수, 짝수, 홀수를 찾는다. 먼저, 짝수는 x%2==0, 즉 2로 나눴을때 나머지가 0이면 짝수다. 하지만 0은 2로 나눠지지만 짝수가 아니므로  (x%2==0&&x!=0)이어야 한다. 다음, 홀수는 반대로 짝수를 구분하고나서 (x%2!=0) 이면 홀수임을 알 수 있다. 양수는 x>0  음수는 x<0 2. 처리과정      ...

2015년 8월 2일 일요일

원하는 숫자의 갯수 구하기(count number)

이번 알고리즘은 자신이 원하는 숫자가 총 몇개나 들어갔는지 찾는 알고리즘이다. 예를들어, 1~200 까지중에 7이라는 숫자가 몇번들어갈까? 뒤에 자리수가 7인것을 197 까지 새면 20개 가 되는가? 아니다. 77, 177, 71 등 7이 두 개이상 들어 가거나 7이 10의 자리, 100의 자리등 어디든지 올 수 있기 때문이다. 이모든 경우의 수를따져 숫자 7이 어디에 들어가던지 그 총 갯수를 찾는 코드를 구현해 보았다. 1. 선행 지식 각자리수 마다 7을 찾는 방법을 알아야한다. 그래서 생각한 방법이. 각자리수를 10의 배수로 나누고 그나머지를 일의 자리로 만들어 그 값이 7이면 그 수의 7이 들어가는 갯수를 알수있다. 예를들어 , 1777이라는 숫자가있으면 10000으로 나눴을때 몫이 0 이고 나머지가 1777이다. 이때, 이값을 10000보다 한 자리 작은 자릿수 1000...

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과 자기 자신 밖에...

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

알고리즘 공부를 시작한게 된 건 컴퓨터적인 사고방식을 키우고자 함이다. 알고리즘을 컴퓨터로 구현하기 위해서는 선행지식과 처리과정을 알고있어야한다. 첫째로 거스름돈 알고리즘을 짜보았다. 거스름돈 알고리즘이란, 우리가 보통 돈을받고 거스름돈을 줄때 가장 큰 단위의 지폐부터 주고 그 다음 큰 단위 그다음 그다음 이런식으로 차례로 화폐를 교환 해주는것을 컴퓨터로 계산하게 만든 알고리즘을 말한다. 예를들어 9700원을 효율적으로 주려면, 5000원 짜리 1장, 1000원짜리 4장, 5원짜리 1개, 100원짜리 2개로 거슬러 주는것이다.  위와 같이 코인을 입력받으면 이렇게 가장효율적으로 거슬러주는 프로그램이다. 다음은 이 알고리즘을 컴퓨터로 구현하는 과정 1. 선행지식 이 알고리즘을 구현하기 위해 필요한 선행지식으로는 우리는 가장 큰 단위의 화폐부터 작은...

2015년 7월 29일 수요일

Linked List

List Class 를 C 를 이용해 만들어보았다. (연필로 하나 씩 짜보니 많은 코딩 실력에 향상에 도움을 주었다 . 이렇게 보니 뿌듯ㅎㅎ) 벡터는 자료를 삽입, 추가 , 제거 하는데 모두 시간복잡도가 n이지만, 리스트는 자료 삽입, 추가, 제거가 벡터와 달리 복잡도 1이라는 용이한점을 가진다. 이유는 리스트의 구조에 있다 . 밑의 그림을 보면 리스트를 이해하기 쉽다. 먼저 리스트의 구조는 위의 사진과 같다. 헤드라는 포인터가 가장첫번째 자료를 갖는 Node 형 구조체를 가르킨다. Node 형 구조체는 다음(next) 과 전(previous) Node 형 구조체와 연결 할 수있는 포인터를  가지고 있다.  다음 사진은 새로운 자료(data)를 갖는 구조체를 추가할때의 과정이다. 4라는 자료를 연결하기 위해서...

2015년 7월 23일 목요일

Vector(c 자료구조 벡터)

2015/07/23 수업 3일차 벡터란 .,, 한마디로 동적배열이다. 오늘 처음으로 c로 클래스를 구현해 보았다. 객체지향이라는 의미를 몸소 느낄수 있는 코딩시간이었다. c를 객체 지향적으로 만드는일은 매우 번거롭다. 구조체 안에 변수만 넣을 수 있다. 그래서, visual studio에서 구조체 접근 연산자인 '.' 을 찍으면 멤버 변수를 볼 수 있다. 만일 여기에, 함수를 넣을 수 있다면? c++언어의 클래스와 비슷한 기능을 사용할 수 있다. 하지만, c에서는 함수를 구조체에 넣을 수 없기 때문에, 함수 포인터를 사용하였다. ------------------------------------------------------------------------------------------------ 벡터의 동작원리 위와 같이,[1,2,3] 인 크기가 3개인 배열이있다....