알고리즘/암기(91)
-
함수 내 큰 배열 선언 오류
data 영역이 아닌 함수 내의 스택 영역에 약 백만 개의 int 배열을 선언할 때 오류가 발생한다 함수 내에서 선언되어 사용되는 배열의 경우 배열 자체가 스택 영역에 생성되고 함수가 호출될 때마다 해당 배열을 위한 메모리를 새로 생성하고 초기화하는 작업을 하기 때문에 배열의 크기가 큰 경우에는 다른 방법을 사용해야 한다. 이론적으로는 지역변수의 영역 크기는 제한되어있지 않지만 시스템에 따라 하드웨어적인 제한이나 스택 운용의 효율을 높이기 위해 스택의 크기를 제한하기도 한다. 그렇게 때문에 함수 내에서 선언되는 배열의 크기가 과도하게 큰 경우 프로그램이 강제 종료될 수 있다. 그렇기 때문에 배열의 크기가 조금이라도 큰 경우에는 힙 영역이나 data 영역을 사용하는 것이 올바르다
2019.05.15 -
파라메트릭 서치
https://sarah950716.tistory.com/16?category=598483 1) (최솟값을 구하는 경우) 최솟값이 x라면, x이상의 값에 대해서는 모두 조건을 만족 2) (최댓값을 구하는 경우) 최댓값이 x라면, x이하의 값에 대해서는 모두 조건을 만족 1) 2)와 같이 연속적으로 조건을 만족한다면 이분탐색을 이용해 만족하는 변수값을 구할 수 있다
2019.05.14 -
Disjoint-set
Union-find라고도 불리는 서로소 집합 알고리즘으로 두 노드가 같은 집합에 있는지 여부를 판별할 수 있다 Disjoint-set 문제는 두 노드의 연결 상태를 주고 마지막에 여부를 묻는다 부모를 집합의 가장 작은 번호로 기입한 후 재귀적으로 두 노드를 탐색해서 부모를 알아내고 비교할 수 있다 int getparent(int idx) { if(parent[idx] == idx) return idx; else parent[idx] = getparent(parent[idx]); } void uniongroup(int a, int b) { int ap = parent(a); int bp = parent(b); if(ap < bp) parent[bp] = ap; else parent[ap] = bp; }
2019.05.14 -
구조체를 활용한 priority_queue 비교함수
먼저 우선순위 큐는 보통 힙의 구조를 가지는 비선형 자료구조다. 배열로 구성할 경우엔 1. 자료의 낭비 2. 삽입에서 시간을 크게 잡아먹는다. 또한 연결리스트로 구성할 경우에도 삽입 시간이 배열과 같기에 더 낫다. 따라서 logN의 시간으로 삽입과 삭제를 할 수 있는 힙의 구조로 우선순위 큐를 작성할 수 있다 그래서 priority_queue에 우선순위를 줘야 하는데 기본적으로 우선순위는 큰 값이 높게 설정되어 있다 따라서 큰 수부터 출력하고 싶으면 우선순위 큐를 선언만하고 사용하면 된다 문제: https://www.acmicpc.net/problem/11279 https://github.com/surinoel/boj/blob/master/11729.cpp 하지만 특정한 구조체에서는 각기 다른 경우의 수..
2019.05.14 -
구조체 초기화
123456789#include int main(void) { struct shape a, b; memset(&a, 0, sizeof(struct shape)); memset(&b, 0, sizeof(struct shape)); ....}Colored by Color Scriptercs
2019.05.11 -
입력 갯수를 확인하는 2가지 방법
while(scanf("%d %d", &n, &m) == 2) while(cin >> n >> m) 형식 지정자에 올바른 자료형이 들어가지 않으면 입력 갯수에서 제한한다 예를 들어, scanf("%d %d", &n, &m) == 2에서 2, a를 입력하면 a는 문자로 인식해서 1을 반환하게 된다
2019.05.08