반응형

전체 글 652

다익스트라 알고리즘

다익스트라의 핵심은 다음글을 보기 바랍니다. 2015/06/02 - [프로그래밍/알고리즘] - 다익스트라 알고리즘(Dijkstra Algorithm)최단경로 알고리즘 아래 글은 제가 오래전 다익스트라를 처음 공부할 때 쓴 글이므로 이해가지 않는 부분도 있고 많이 부족합니다. 코드만 참고하시길 바랍니다. 다익스트라 알고리즘, 이름조차 어렵다. 이 알고리즘을 이해하기위해선 깊이 우선, 너비우선 탐색을 이해해야한다. 2013/06/05 - [프로그래밍/알고리즘] - 탐색-깊이우선탐색, 너비우선탐색 2013/06/07 - [프로그래밍/알고리즘] - 위상정렬(topological sort) 다익스트라 알고리즘은 시작점을 정하고 끝점을 정하면 그 두점사이 최단거리를 구하는 알고리즘이다. 다익스트라 알고리즘의 너비우..

3항연산자

A?B:C; 위 식은 3항연산자의 기본형태다. A가 참이면 B 거짓이면 C로 가라는 의미다. 특징을 좀더 살펴보면 ? 뒤의 문장과 :뒤의 문장은 if esle 문과 비슷하다. else문이 스위치형식으로 거짓인경우 실행되고 참인경우 실행안되는 것 처럼 말이다. 그럼아래식을 보고 이야기하자. A?B,B':C:C'; 여기서 B'와 C'는 조건에 대한 결과와는 상관없다. 여기서 if else문과 좀 다른 특징이 눈에 뛰는데 A가 참인경우 B와 B'가 실행된다. 그리고 C'가 실행된다. 하지만 A가 거짓인경우? B' 가 실행되는가? 그렇지않다 이경우 C와 C'가 실행된다. 이는 if else문의 성격을 띠지만 ,연산자가 쓰이게되면 goto문의 특징을 갖게된다는것이다. 결국 A가 참인경우 C는 실행이 안되므로 결론..

프로그래밍/cpp 2013.06.17

클래스 내부의 static 에 관한 고찰

static 멤버함수는 this객체를 받지않는다.(static은 사용범위가 지정되어 있기때문이다. static멤버함수의 경우 사용범위는 클래스가 생성한 객체가아닌 클래스 전반적으로 사용하는 함수, 다시말하면 클래스의 static 멤버를 다루는 함수라 봐도 좋다) 때문에 static 멤버함수는 클래스형에 의해서 호출되는 함수다. 객체를 통해 호출하려고해도 그 객체의 클래스형만 살펴본 후 맞다면 호출한다. static이 아닌 멤버의 경우 함수내에서 this의 호출을 통해 이루어진다. 기본적으로 this가 전달된후 컴파일러상에서 this로 접근한다. 그렇기때문에 static 멤버변수가 아닌 변수를 접근하는건 불가능하다. 또산 static 선언은 목적파일 링크시에 알리지않는다는 뜻이다.(선언된 파일 내부에서만 ..

프로그래밍/cpp 2013.06.13

포인터사용시 주의점2

일반적으로 포인터는 특정 변수를 가르킨다. 그리고 이 포인터가 가르키는 변수는 타입이 정해져서 그 변수가 담고있는 내용은 틀에 맞춰 끼워진내용이란말이다. 다시말해 형식이 정해져있는 내용이다. 예를들어 int형 변수를 가르키는 포인터는 그변수가 int형(4Byte)를 가르키기때문에 그에 맞춰 변수의 주소값과 변수의 타입명을 확실히 알고 값에 접근할 수가있다. 이제부터 쓰는 내용은 이런 확실함에 대한 이야기다. 내부적으로 컴파일러의 설계에 따라 달라질 수 가 있을지모르겠고, 난 전혀 컴파일러를 설계해보지 않았기때문에 경험적으로 말하는 것임을 미리 말해둔다. char* str; 위선언은 무척 많이 보았을것이다. 위선언을 보고 동적할당을 해야겠구나. 라고 생각을 한다면, 어느정도 기본을 충실히 한 사람일 것이다..

객체지향의 시작 첫번째글

객체지향은 왜 시작되었을까.. 그리고 왜 필요한것일까. C언어를 공부하다 C++을 접하게되면 객체지향의 필요성에대해서 의문을 가지게된다. C언어의 순차적이고 직관적인 문법에비해, 이론만으론 추상적인 개념들에 왜 필요한지 적용하는방법에대해서도 서툴기만하다. 프로그래밍을하면 크게 변수, 함수, 그리고 제어구문 이렇게 큰틀의 반복이다. 전부 변수를 다루기위한것이다. 이런변수를 다루면서 코드의 길이가 길어지면 변수도 많아지고 함수도많아지고 지역변수도많아지고 점점 헷갈리게된다. 또한 전역적으로필요한 변수도 동류끼리 구분지어질 필요가 있을경우가있다. 객체지향은 이런 변수와 함수를 잘사용하기위해 필요하지않을까 생각한다. 객체지향의 이점중 한가지가 계통정리를 통해 동류의 변수들을 묶을 수 있다는 것이다. 또한 이런 동..

프로그래밍/cpp 2013.06.12

오일러의 한붓그리기(작성중)

깊이우선 탐색과 별반 다르지않다. 하지만 알고리즘의 1%만 수정되어도 제대로 이해를 하지못한다면 완전 다르게 보일수도있다. 컴퓨터의 알고리즘이란 1%로인해 전체적이 해법과 결과물이 달라지기때문이다. 익히 말한바와 같이 깊이 우선탐색은 재귀의 진행시 계속해서 시작정점을 반환하는 탐색방법이다. 내가 쓴방법은 한번 갔던 곳은 플래그로 표시를 해두었기때문에 판정을통해 다시는 안가도록 해놓았다. 이런경우는 노드와 노드사이의 간선이 하나만 존재할때 가능한일이다. 간선이 2개이상일땐 플래그를 해놓는 방법은 유용하지않다. 직접 행렬상의 간선의 개수를 지우는 방식으로 하겠다. 또한 한붓그리기의 취지에 맞게 모든 간선을 한번에 다 지나가야하므로 판정을 간선을 다 통과했는지 해야하고 이러한 모든 방법의 수를 구하기위해선, ..

unresolved externals, undefined reference to A::test()

클래스 static 멤버변수는 클래스내부에서 초기화 할 수 없다. 특히 클래스에서 static 함수는 클래스멤버변수중 static 멤버변수만 사용할 수 있는데, 여기서 주의할점은 static 멤버함수가 static만 사용할 수 있다고해서 초기화까지 가능한 것은 아니다. static 멤버변수는 클래스외부에서 명시적인 초기화가 필요하다. ex) int A::num = 1; 명시적 초기화 후에는 스태틱 멤버함수의 명시적인 사용도 가능하다. undefined reference to A::test() 정의되지 않은 참조 A::test() A::test()가 정의되지 않고서 사용을 하려할 경우. 이럴경우 함수정의부분에 클래스명시를 안한경우다. unresolved externals 에러의원인은 다양하다. 보통 클래스..

위상정렬(topological sort)

위상정렬이란 방향 그래프에서 연결되어 있는 정점을 재귀가 회귀하는 역순서로 정렬하는 것을 말한다. (재귀의 진행의 반대는 재귀의 회귀라고 하자. 진행은 스택에 쌓는작업이고 회귀는 스택을 푸는 작업이라고하자.) 내가 이해하는 대로 쓴것이다. 우선 위상정렬은 탐색과 다르게 탐색할때의 정점을 재귀의 회기시에 반환해서 정렬하는 형태를 말한다. 탐색은 정점에서 다음 노드들 다시말에 정점과 연결된 곳을 재귀진행시에 반환 했었다.(다음노드는 다음탐색의 정점이 되어서 탐색을 진행해 나간다.) 이런위상정렬을 할시 폐쇄로가 있다면 위상정렬의 해는 없어지게된다. 위상정렬을 하기위해선 우선 폐쇄로에대한 판단을 먼저 해야한다. 폐쇄로란, 특정 정점에서 시작해서 회로를 도는중 그 정점으로 돌아오는 경우 폐쇄로로 판정된다. 폐쇄로..

반응형