본문 바로가기
728x90

전체 글102

[C++] 왜 typedef 가 아닌 using을 사용해야 할까? 사용자 정의 자료형 또는 STL 컨테이너들을 사용하다보면 자료형이 매우 길어지기도 한다. std::unique_ptr 처럼 말이다. 그런 경우 우리는 편의를 위해 typedef 를 사용한다. 그런데 typedef 자체는 C++98부터 전해져오던 방식으로 구식이 되었다 C++11에서 사용하는데 문제는 없지만 별칭 선언(alias declaration)을 제공하기 때문이다. 그렇다면 별칭 선언은 무엇인가?! 바로 using 을 사용하는 것이다. 위 처럼 사용한다. using 과 typedef는 하는 일이 완전히 같다. 그렇다면 왜 using을 사용하는 것이 더 좋을까? 함수포인터를 보자. 아래의 두 함수포인터는 모두 같은 일을 수행한다. 위 두 함수포인터는 완전히 같다. 그렇지만 대입 연산을 사용하는 아래(.. [프로그래밍 공부]/C&C++ 2022. 1. 22.
[C++] enum class 사용하기 일반적으로 중괄호 안에서 선언된 변수 등은 중괄호 안에서만 효력을 발휘한다. 전역에서 선언된 것들이 아닌 로컬영역에서 선언된 것들이 그런 것들이다. 위 처럼 test 함수의 로컬 영역에서 선언된 test는 그 범위를 벗어나는 순간 없는 것으로 판단된다. 따라서 main 함수 안에서 또 다시 test를 선언하고 사용할 수 있다. 그런데 enum의 경우 좀 다르다. 이를 공식적으로 unscoped enum 이라 한다. ( 이하 범위 없는 enum ) 이와 반대되는 개념으로 C++11에 도입된 scoped enum 이 존재한다 ( 이하 범위 있는 enum ) 바로 enum클래스 이다. 범위 있는 enum은 중괄호의 범위가 효력을 발휘하게 된다 범위 있는 enum의 강점 중 하나는 열거자들의 자료형에 강력하게 .. [프로그래밍 공부]/C&C++ 2022. 1. 22.
[C++] 범위 기반 for 문 다른 언어에서 사용하는 foreach와 같은 문법이다. foreach를 안다면 범위 기반 for문이 무엇인지 바로 알 수 있을 것이다. 기본적인 사용법 coll은 에러를 없애기 위해 임시로 만들었다. 범위 기반 for문 이기 때문에 배열 등의 범위를 가질 수 있는 변수를 사용해야한다. std::initializer_list 는 being() 과 end()를 제공하기 때문에 초기화자 목록 또한 범위 기반 for문을 사용할 수 있다. for문 내부 명령문은 지역 복사본을 가지고 동작하기 떄문에 참조자를 사용한다. 한번에 보자. 결과값이 같은 것을 볼 수 있다. 또한 크기가 알려진 일반 C 형식의 배열도 범위 기반 for문을 사용할 수 있다. [프로그래밍 공부]/C&C++ 2022. 1. 22.
[Algorithm] 해시 테이블의 크기를 소수(Prime Number)로 해야하는 이유 https://stackoverflow.com/questions/3980117/hash-table-why-size-should-be-prime Hash table: why size should be prime? Possible Duplicate: Why should hash functions use a prime number modulus? Why is it necessary for a hash table's (the data structure) size to be a prime? From what I understand, it assures a ... stackoverflow.com 소수 : 1과 자기 자신으로만 나눌 수 있는 1보다 큰 양수 키 값이 하나의 값에 모이는 것을 줄여 더욱 균일한 분산을 .. [프로그래밍 공부]/Algorithm 2022. 1. 22.
[Algorithm] A* 길찾기 알고리즘 구현 미로에서의 길 찾기 벽 짚고 따라가기는 방법을 사용한다. 오른쪽 또는 왼쪽의 노드가 벽인지 판단하고 벽이라면 한칸 이동하는 방법을 사용한다. 그렇다면 결국에는 출구에 도착한다( 미로에 경우 ) 목적지에 도착은 하지만 최단경로는 찾을 수 없다. 최단경로 찾기 - 너비 우선 탐색 1. 시작 칸을 큐에 추가한다. 2. 시작 칸에 표시를 한다(방문했다는 증거) 3. 큐에서 맨 앞 노드를 뽑아낸다. 4. 현재 칸이 목표이면 알고리즘 종료. 5. 현재 칸의 자식들 중에 방문표시가 없으면 그 칸들의 이전 포인터를 현재포인터로 설정하고 큐에 추가한다. 6. 알고리즘이 종료될 때 까지 3~5 반복한다. 문제점 대각선이동과 수평이동의 크기가 같다고 판정하기 때문에 대각이동을 많이 하게 된다. 그렇게 되면 실제 거리를 재었.. [프로그래밍 공부]/Algorithm 2022. 1. 22.
[Algorithm] 재귀를 이용하여 하노이의 탑 해결하기 재귀( recursion )란? 어떠한 함수가 내부에서 자기 자신을 호출하는 것 하노이의 탑 재귀함수를 사용하여 하노이의 탑 문제를 해결하는 코드를 만들어보자. Hanoi 함수는 개수가 2개일 때를 생각하고 만들면 굉장히 간단하다. n 이 2일 때를 가정하면 2번째 돌을 바닥에 깔기 위해서는 자신의 위에 있는 돌을 전부 오픈된 공간으로 보내야한다. 따라서 1번째 돌을 옮겨야 하는데 결국 첫번째 돌은 n-1 번째 돌이다. 즉 n-1번째의 돌을 _open으로 보내는 것을 먼저하고( 함수 1번째 라인) 2번째 위치를 바꾼다( 함수 2번째 라인 ) 그리고 다시 n-1의 위치를 _dest로 옮겨야 하는데 n-1의 돌은 현재 _open 위치에 있다. 따라서 출발지점은 _open이 되며 목적지는 _dest이고 빈공간.. [프로그래밍 공부]/Algorithm 2022. 1. 22.
[Algorithm] Selection Sort : 선택 정렬, 선택 소트 ( 코드 포함 ) 배열의 가장 큰 원소를 찾아 배열의맨 끝자리에 있는 원소와 자리를 바꾼다. 맨 마지막 원소를 제외한 원소를 다시 찾는다. 이 작업을 반복하는 것이 선택정렬이다. 선택정렬의 수행시간(시간복잡도)은 어떠한 경우에도 O(n²) 이다. 매우 느리다. n번 반복하는 for문을 두번 반복하게 되는데 이는 n² 번 자료 확인을 하게 되는 것이다. 또한 모든 경우에 시간복잡도는 n²이 된다. 코드 정렬된 것을 볼 수 있다. [프로그래밍 공부]/Algorithm 2022. 1. 22.
[Algorithm] Bubble Sort : 버블 정렬, 버블 소트 ( 코드 포함 ) 선택정렬과 마찬가지로 가장 큰 원소를 끝의 자리로 옮기는 작업을 반복하는 정렬이다. 단, 끝의 자리로 보내는 방법이 다르다. 비교하면서 더 큰 숫자를 오른쪽으로 계속 보내게 되는데 이 결과 가장 큰 수가 가장 오른쪽에 간다. 버블정렬의 수행시간(시간복잡도)은 O(n²)이다. 따라서 숫자가 적을 때만 사용하자. [프로그래밍 공부]/Algorithm 2022. 1. 22.
728x90