'Programming/C Language' 카테고리의 글 목록
728x90

Programming/C Language 15

[C언어] A* 알고리즘(에이스타 알고리즘)

Dijkstra 알고리즘 문제점 현재위치로부터 모든 방향으로 최단경로를 찾아 쓸대없는 경로를 모두 탐색(시간 오래걸림) 개선한 알고리즘이 A* 알고리즘이다! A* 알고리즘 vertex 중 도착점과 가까운 vertex를 골라 경로 탐색 g(n): 시작 노드부터 현재 노드까지의 비용 h(n): 현재 노드에서 목표 노드까지의 예상 비용 ( 휴리스틱 함수, 설계하는 방법에 따라 알고리즘 성능 결정) 두 값을 더한 f(n) = g(n) + h(n)이 가장 최소가 되는 노드를 다음 탐색 노드로 선정한다. A* 알고리즘 단점: 찾은 경로가 최단경로가 아닐 수 있다. Dijkstra vs A* 알고리즘 비교 A* 알고리즘을 이용하여 미로찾기 구현하기 1. 각 장소에 해당하는 dtable의 배열을 초기화한다. 2. 출발..

[C언어] Dijkstra를 이용한 미로찾기

구현방법 1. 주어진 지도를 2차원 배열로 만든다. (1= 지나갈 수 있음 / 0=벽이 있음) ※ 모든 거리는 1로 계산하였다. 2. 2차원으로 만든 지도의 연결관계를 또다른 배열 Graph에 표현한다. 내 좌표에서 상,하,좌,우가 지도안에 있고, 벽이 아니면 연결되있다는 것을 의미한다. map의 (i,j)를 값으로 나타내면 3*i+j이고, n 값이 나타내는 map 배열의 좌표를 나타내면 (n/3, n%3)으로 나타낸다. 3. Dijkstra 알고리즘을 통해 최단경로를 찾는다. 만약 아직 현재 좌표의 최단거리를 찾지 않았을 때, 시작좌표~현재 좌표의 최단거리를 알고 현재좌표~다음좌표의 거리를 알면 두 값을 더해서 다음좌표의 최단거리 값에 저장한다. 만약 다른 경로를 통해 간 거리가 짧다면 그 거리 값을 ..

[C언어] Dijkstra

Dijkstra 알고리즘이란? 최단거리르 찾는 아록리즘 장점: 모든 최든경로를 알 수있다 / 누구를 거쳐서 지나갔는지 알 수 있다. Dijkstra 알고리즘 구현방법 1. 하나의 vertex로부터 시작 2. 최단거리의 vertex로부터 하나씩 추가 3. 모든 vertex에 대한 최단거리를 찾을 때 반복 [ex] 하기와 같은 그래프가 있고, A->F까지 가는 최단경로를 구하려면... 1. 그래프에 대해 Table로 내용을 작성한다. 2. 시작점을 'A'라 하면, A와 연결된 경로를 입력한다. 3. 'B'와 연결된 최단거리 노드를 찾고, 경로를 입력한다. 4.'C'와 관련된 최단거리 노드를 찾고, 경로를 입력한다. 이때, D로 갈때, A-C-D로 가는것이 A-B-D로 가는것보다 빠르므로 update 해준다...

[C언어] DFS / BFS / MST 구현하기

그래프 탐색 알고리즘 하나의 Vertex에서 시작하여 Graph의 모든 Vertex를 방문하는 알고리즘(중복 없이 방문) DFS(Depth First Search) 깊이 위주의 탐색 길을 가다 막히면 갈림길이 있던 곳으로 돌아와 다시 시작 Stack / 재귀함수 이용 1. Stack 으로 구현했을 경우 #include #define NUM_VERTEX 5 int graph[NUM_VERTEX][NUM_VERTEX]; int visited[NUM_VERTEX]; char stack[NUM_VERTEX]; int top = -1; void push(char s){ if (top == NUM_VERTEX - 1) return; top++; stack[top]=s; } char pop(){ if (top == ..

[C언어] 그래프의 개요

그래프란? 연결되어 있는 객체 간의 관계를 표현할 수 있는 자료구소 [ex] 지하철 자료구조 그래프 용어 Vertex(정점): node를 나타냄 Edge(간선): Vertext간의 관계를 나타내는 선(Vertex를 연결해줌) Adjacent vertex : 어느 vertex에 대해 edge 로 연결된 vertex(A's adjacent vertex ->B,C,D / B's adjacent vertex -> A, C) Degree: edge의 개수 Cycle: 시작 vertex로 다시 돌아오는 그래프( 시작 vertex=도착vertex) Completed Graph: 모든 vertex들이 다른 vertex들과 모두 연결된 그래프, edege의 개수=n(n-1)/2 (n은 vertex 개수) 그래프의 종류 ..

[C언어] 문자열

문자열이란? 문자열은 문자들의 연속이다. 즉 문자들이 여러 개 모인 것이 문자열이다. 문자열은 큰따옴표를 이용하여 표현한다. 특수문자이건 공백문자이건 뭐든지 큰따옴표(")로 둘러싸인 것이 문자열이 된다. 이들 문자열도 필요한 데이터이므로 메모리에 저장된다. [ex] "Hello World!" ※ 큰따옴표(")와 작은따옴표(')를 잘 구분하자! 문자열은 큰따옴표(")로, 문자는 작은따옴표(')로 표현한다. 문자열 처리 라이브러리 문자열을 사용하다 보면 두 개의 문자열을 붙이는 작업이나 두 개의 문자열을 서로 비교하는 작업이 필요해진다. 이런 문자열 처리 작업을 프로그래머가 직접 함수로 작성하여 사용하는 것도 가능하지만, 문자열 조작을 처리해주는 많은 라이브러리가 존재한다. 문자열 라이브러리는 string...

[C언어] 포인터

포인터란? 포인터(pointer)는 가리킨다는 동사 point에 er이 붙은 것이다. 따라서 가리키는 것이란 뜻이다. 포인터는 데이터의 메모리에 저장된 변수의 주소를 가리키는 변수이다. 포인터는 변수이지만 저장하고 있는 것은 데이터의 주소이다. 포인터 선언 포인터를 선언하려면 포인터가 가리키게 되는 대상과 같은 자료형을 먼저 쓰고, *을 붙인 다음, 포인터의 이름을 쓴다. *은 곱하기가 아니라, 간접 참조 연산자로, 포인터를 이용하여 메모리를 간접 참조한다. 포인터와 변수의 연결 포인터가 생성된 직후에는 아직 초기화되어 있지 않다. 따라서 포인터는 사용하기 직전에 반드시 초기화하여야 한다. 포인터에는 변수의 주소가 저장되어야 하므로 &연산자를 이용하여 변수의 주소를 계산하여 포인터에 대입해야 한다. #i..

[C언어] 배열

배열은 왜 필요할까? 예를 들어서 학생 10명이 있고, 이들의 성적의 평균을 계산한다고 가정하자. 평균을 계산하려면 먼저 각각의 학생들의 성적을 읽어서 어딘가에 저장해야 한다. 데이터를 저장할 수 있는 곳은 변수인데, 학생이 10명이므로 변수도 10개 만들어야 한다. int s0,s1, s2, s 3.... s9; 하지만 이 학생의 인원이 30명, 100명... 1000명이 된다고 생각해보자. 이것을 일일이 변수를 선언한다 그러면 막막할 것이다. 따라서 다른 방법이 필요하다. 손쉽게 대량의 데이터를 저장할 수 있는 공간을 만들 수 있어야 하고, 데이터들을 손쉽게 처리할 수 있는 방법이 필요하다. 그래서 탄생한 것이 바로 배열이다. 배열이란? 동일한 타입의 데이터가 여러 개 저장되어 있는 데이터 장소이다...

[C언어] 함수

함수 프로그램을 구성하는 기본적인 구성요소. 하나의 프로그램은 여러 함수들이 모여 이루어진다. 각 함수들은 다른 함수들과 연결되어서 하나의 프로그램을 구성할 수 있으며, 한번 만들어지면 다른 프로그램에서도 재사용될 수 있다. 또 함수를 사용하면 가독성이 증대되고, 유지관리도 쉬워지는 장점도 있다. 함수의 특징 함수는 서로 구별되는 이름을 가지고 있어야 한다. 함수는 특정한 작업을 수행한다. 함수는 입력을 받을 수 있고, 수행 결과를 반환할 수 있다. 함수의 장점 함수를 사용하면 코드가 중복되는 것을 막을 수 있다. 한번 작성된 함수는 여러 번 재사용 할 수 있다. 함수를 사용하면 전체 프로그램을 모듈로 나눌 수 있어서 개발 과정이 쉬워지고 보다 체계적이 되면서 유지 보수도 쉬워진다. #include /*..

[C언어] 반복문

반복문 반복문은 같은 처리 과정을 여러 번 되풀이하는 것을 말한다. 어떤 조건을 만족할 때까지 같은 문장을 계속 반복하여 실행하는 제어 구조이다. while 문 while 문은 주어진 조건이 만족되는 동안 문장들을 반복 실행하는 구조이다. while 문은 이와 같이 조건이 성립된다면, 중괄호{}안에 있는 내용을 계속 수행한다. 만약 조건이 성립되지 않으면 while 문을 빠져나온다. #include /*구구단 출력하기-while문*/ int main(void) { int n; int i = 1; printf("출력하고 싶은 단을 입력하세요:"); scanf("%d", &n); while (i

728x90