C++이 지원하는 cout과 cin 함수가 C의 scanf, printf 보다 느리다는 사실은 많은 사람들이 알고 있다. 알고리즘 문제를 풀면서 입출력 시간이 크게 중요하지 않은 경우에는 C++의 입출력 함수가 쉽기 때문에 주로 사용을 했는 데, 많은 사람들이 속도를 위해서 C의 입출력 함수를 사용한다. 과연 속도가 얼마나 차이가 날지 궁금했다. 실험은 알고리즘 문제 풀이 과정에서 입출력 부분만 바꿔서 실험해보았다. 일반적으로 입출력의 병목현상이 심할 경우에 혹은, 입출력 함수의 비중이 큰 경우 일수록 크게 차이가 날 것이다. 다만 이 몇 가지 실험이 모든 일반적인 경우를 포함하지는 못하므로 참고용으로만 보면 좋을 것 같다. SWexpert 아카데미에 있는 문제들로 테스트를 해보았다. 다른 코드는 동일하..
이전에 포스팅한 재귀 알고리즘을 이용한 부분 집합 생성 알고리즘과 유사한 방식이다. 참고: 재귀함수를 이용한 부분 집합 생성 알고리즘 재귀 함수를 이용한 부분 집합 생성 알고리즘 #define _CRT_SECURE_NO_WARNINGS #include #include using namespace std; vector subset; int n = 4; void search(int k) { if (k == n + 1) { // 부분 집합 출력 for (int i = 0; i < subset.size(); i++) cout.. doomed-lab.tistory.com 아래는 n = 7 , r = 4 라고 가정하고 7C4의 경우를 모두 출력하는 코드이다. #include #include using namespa..
먼저 아래와 같은 test 코드를 보자. #include using namespace std; void func(int** map, int* ptr) { map[0][1] = 100; int b = 99; ptr = &b; } int main() { int a = 100; int* ptr = &a; int** map = new int* [2]; map[0] = new int[2]; map[1] = new int[2]; map[0][0] = 0; map[0][1] = 0; map[1][0] = 0; map[1][1] = 0; func(map, ptr); cout
반복자(Iterator)란 자료 구조의 원소를 가리키는 변수다. lower_bound 와 upper_bound #include #include #include #include #define vi vector using namespace std; int main() { vi v = { 1,1,1,1,2,3,3,4,5,7,8,8,8 }; auto a = lower_bound(v.begin(), v.end(), 5); auto b = upper_bound(v.begin(), v.end(), 5); cout
이번엔 1부터 n까지의 원소를 가지는 집합으로 만들 수 있는 순열들을 생성하는 알고리즘이다. 재귀 함수로 구현했기 때문에, 재귀함수 사용에 익숙하지않다면, 한 눈에 코드의 동작을 이해하기는 쉽지않을 수 있다. #define _CRT_SECURE_NO_WARNINGS #include #include using namespace std; #define REP(i,a,b) for(int i = a; i
C++ 프로그램에서 입력과 출력이 병목이 될 때가 있다. 혹은 쉽게 C++의 cout cin가 scanf 나 printf 에 비해서 느리기 때문에 가속화 시킬 목적으로 ios::sync_with_stdio(0); cin.tie(0); 을 코드 시작부분에 입력해준다. 주의해야할 사항은 이 경우엔, scanf, printf 등의 C 입출력 함수와 동시에 사용할 수 없다. 추가로 "\n" 이 endl보다 빠르다 이는 endl은 플러시(출력 버퍼 비움)가 같이 일어나기 때문이다. 일반적인 코드를 짤 때가 아닌, 경진 프로그래밍 혹은 알고리즘 문제풀이 등에서 입출력 속도가 문제되는 경우가 있을 수 있기 때문에, 불편하더라도 이 경우엔 scanf 나 printf를 사용하는 것도 좋은 방법이다.