목록분류 전체보기 (15)
내안에있어
문제를 풀다가 다음과 같은 착오가 발생하였다. 원소의 개수를 7개 집어넣었는데 의도치 않은 결과값이 나와 살펴보니,1int value=get_area(wall,0,wall.size()-1);cs 12345vector wall(N,0); for (int i = 0; i > tall; wall.push_back(tall); }cs위와 같은 코드에서 문제가 발생하였다. 다른 사람들의 코드를 참고하다보니 문제가 생겨서 원인을 분석해보았는데,즉 , vector wall(N,0);에서 {0,0,0,0,0,0}로 벡터가 이미완성된후 push_back을 통해 추가하여서 최종적으론{0,0,0,0,0,0,7,1,5,9,6,7,3} 으로 벡터가 완성되어 1 int value=get_area(wall,0,N-1); Color..
#include#includeusing namespace std;int main() { vector myvector(3, 100); vector::iterator it; it = myvector.end(); it = myvector.insert(it, 200); myvector.insert(it, 2, 300); it = myvector.end(); std::vector anothervector(2, 400); myvector.insert(it - 2, anothervector.begin(), anothervector.end()); int myarray[] = { 501,502,503 }; myvector.insert(myvector.begin(), myarray, myarray + 3); cout
컴파일러와 인터프리터에 대해서 알아보자. 컴파일러와 인터프리터는 모두 고급언어(java, c언어등)를 pc가 읽을수 있는 언어(2진법)로 변환하는 장치이다. 인터프리터와 컴파일의 차이를 보면 인터프리터란 고급언어로 작성된 원시코드 명령문들을 한번에 한 줄씩 읽어들여서 실행하는 프로그램이며 컴파일러란 특정 프로그램 언어로 작성된 문장을 처리하여 기계어 또는 컴퓨터가 사용할 수 있는 코드로 변경시켜주는 특수한 용도의 프로그램이라고 정의할 수 있다. 컴파일러와 인터프리터의 가장큰 차이점은 해석을 한번에 하느냐 아니면 실행과동시에 부분적으로 해석을 하느냐이다. 컴파일러는 프로그램 전체를 한번에 기계어로 편집하는 것을 말하고 인터프리터는 작성한 프로그램을 한줄씩 한줄씩 번역하면서 실행하는 것이다. 각각의 실행 과..
https://www.acmicpc.net/problem/10799 문제는 굉장히 어려워 보이나 규칙성을 찾는다면 스택을 이용해 간단하게 해결할 수 있는 문제이다. 입력받은 string을 순차적으로 검사해괄호 ( 가 있다면 스택에 추가하고,괄호 ) 가 있다면 레이저에 의한 ')'인지 쇠막대기에 의한 ')'인지확인하여 각각의 경우를 처리해주면 된다. 레이저에의한 ) 괄호 같은 경우엔 겹쳐져있는 막대기를 한번에 자르는 것이므로 스택에 남아있는 ' ( ' 의 수를 추가하면 될 것 같다.또한 레이저가 끝났으므로 pop을 하여 앞에 남아있는 레이저의 ( 괄호 또한 삭제해준다. 쇠막대기에 의햔 ) 괄호는 쇠막대기가 끝났다는 것을 의미하므로 결과에 +1을 추가해주고, 쇠막대기의 시작을 알려주는 ( 괄호를 pop해준다..
세그먼트 트리는 구간의 최소값이나 최대값 합을 구할 때 사용되는 트리이다.이 트리는 힙과 비슷하게 배열로 나타낼 수 있으며 각 노드는 범위를 가지고 있다. 루트는 자식을 포함하는 범위를 가지게 되는데 index 0의 노드는 0~9의 범위에서 가장 작은 값을 가지게 된다.응용하는 방법으론 가장 작은값이 아닌 큰값, 합, 곱한 값도 사용가능하고 가장 작은 값의 위치도 넣을 수 있다. 123456789101112131415void init(vector &a, vector &tree, int node, int start, int end) { if (start == end) { tree[node] = start; } else { init(a, tree, node * 2, start, (start + end) / ..
재밌는 문제가 있어서 풀어보았다.문제사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제일 친한 친구인 비버의 굴로 가능한 빨리 도망가 홍수를 피하려고 한다.티떱숲의 지도는 R행 C열로 이루어져 있다. 비어있는 곳은 '.'로 표시되어 있고, 물이 차있는 지역은 '*', 돌은 'X'로 표시되어 있다. 비버의 굴은 'D'로, 고슴도치의 위치는 'S'로 나타내어져 있다.매 분마다 고슴도치는 현재 있는 칸과 인접한 네 칸 중 하나로 이동할 수 있다. (위, 아래, 오른쪽, 왼쪽) 물도 매 분마다 비어있는 칸으로 확장한다. 물이 있는 칸과 인접해있는 비어있는 칸(적어도 한 변을 공..
그래프문제를 풀다가 위상정렬이라는 알고리즘이 나와서 정리하는중이야 위상정렬은 DAG( Directed Acyclic Graph) 에서 자주 사용되는 방법인데 DAG란 사이클이 없는 방향그래프를 뜻해. 실생활에서 자주 사용되는 모델이므로 중요하다고 할 수 있어예를 들면 스타크래프트의 테크트리라던지, 스킬트리 등등 작업순서를 모델링한것과 동일하게 생각하면 될거야. 위상정렬이란 어떤 일을 하는 순서를 찾는 알고리즘이야. 1--> 2 의 의미는 2를하기전에 1을 해치워야된다는 건데 이게 문제를 풀다보면 굉장히 헷갈렸어.a[2]=1 일까 a[1]=2일까? 어떻게 저장을 해야되는지 지금도 헷갈려서 글을 쓰면서 정리할거야.아무튼 위상정렬은 BFS에서 사용하는 것처럼 큐를 이용해 연결된 애들을 찾는건데 굉장히 비슷해...
플로이드에 대해서는 다익스트라글에서 확인해. 오늘 플로이드 문제를 다시한번 풀어보다가 괜찮겠지?라고 생각하고 넘어갔다가 오답에 결정적인 기여를 한 코드 2개를 살펴볼거야. 먼저 첫번째 내가작성한 코드1234567for (int i = 1; i
이번엔 다익스트라 알고리즘에 대해서 설명해줄게. 다익스트라 알고리즘이란 모든 정점을 방문해서시작점에서 도착점으로 가는 최단거리를 구할때 사용되는 알고리즘이야. 모든 정점을 방문하기 때문에 굳이 정렬을 할 필요가 없다는 것이 장점. check[i]배열을 둬서 true이면 통과하고 아니면 최단거리를 구하기 시작해. 최단거리를 구하는 방법은1.체크되어있지 않은 정점 중에서 dist의 값이 가장 작은 정점 x를 선택하고,2.x를 체크한뒤 3. x와 연결된 모든 정점을 검사하기 시작해. 즉 간선을 (start, end ,cost)라고 했을 때,dist[end] > dist[start]+ cost라고 하면 dist[end]=dist[start]+cost로 갱신해주는 알고리즘이야! 굉장히 간단하지비슷한 알고리즘으론 ..
크루스칼은 프림과 같이 MST에 쓰이는 알고리즘이야. 일단 MST의 T가 트리이므로 트리의 특징을 갖는것을 명심해야해. 트리는 그래프의 특수한 경우에 해당되는데 그 특수한 경우란 싸이클이 존재하지 않는다는거야. 즉 시작점과 도착점이 같은 루트를 공유하지 않는다는것!! 지금 알아볼 크루스칼 같은경우엔 Union & Find라는 간단한 알고리즘을 통해 root를 공유하지 않으면 cost에 대해서 처리를 하는 알고리즘 이라고 할 수 있어. 복잡도는 크루스칼 같은경우엔 O(E) (E는 Edge) 의 복잡도를 갖고 있으나 정렬에 O(logE)가 필요하므로 총 O(ElogE)라는 복잡도를 가져. 자 크루스칼을 MST에 적용하는 법은 매우 간단해 1. 간선을 정의 2. Union&Find 함수를 정의 3. 그 후 입..