728x90
반응형

C++ 193

C++ 코딩테스트에 유용한 것들 [CPP]

[문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들] - 문자열 정수 변환 string to int, int to string [문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들] - 배열을 초기화시키는 여러가지 방법 [문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들] - vector에서 iterator 활용 [문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들] - 컨테이너 원소들의 최대, 최소 그리고 최대 최소 비교 [문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들] - 입출력이 많음으로 인해 시간초과나는 것 해결 [문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들] - C++에서의..

이진탐색, Binary Search

어떠한 값을 찾을 때 정렬이 되어있는 데이터들 안에서(이게 핵심이다) 정렬하는데 시간이 더 걸린다면 그냥 이진탐색 사용하지 않는게 낫다. 선형 탐색보다 훨씬 빠른 탐색속도를 가진 이진탐색이다. 일반적으로 Array가 이용된다. 우선보자 23을 찾기 위해서 중앙값을 조사한다. 중앙값보다 크기에 이번에는 중앙값으로 나눠진 오른쪽 그룹에 대해 중앙값을 조사한다. 그 나눠진 그룹의 중앙값보다는 작기에 다시 왼쪽 그룹을 만들어 조사한다. 나올 때까지 조사한다. 만약 값이 없다면 값이 없는 것은 어떻게 판단할 수 있을까?? 다시 보자 이번엔 24를 찾는다고 해보자 0-9까지 10개의 원소가 있다. 4번 인덱스를 조사했고 해당 값이 더 커서 5번부터 9번까지 사이의 중앙값인 7번을 조사했다. 7번보다는 작아서 5번과..

C++에서 vector의 단점을 극복한 deque

[프로그래밍언어(Programming Language)/C || C++] - Deque, 덱 , 자료구조 [CPP] 물론 덱에 대한 글은 썼지만 그냥 사용법만 적어놨다. 아무래도 모든 자료구조는 trade-off 관계일 수 밖에 없다. 하지만 이익을 최대한보고 손해를 최소한으로 하는 인간의 끊임 없는 노력은 vector의 단점마저 극복하고자 하였다. vector에서 push_front() 는 insert로 대신한다고 하였다. erase도 마찬가지다. 즉, 맨 앞에서 일어나는 삽입과 삭제는 cost가 높다. 즉, 시간이 오래걸린다. 그래서 사람들은 덱을 만들어냈다. 덱은 아래 3가지의 조건을 만족해야 한다. push_front(), pop_front(), push_back(), pop_back()에 있어서..

CS Interview 2021.06.15

C++ 에서의 자료구조 list를 쓰는 이유

우선 forward_list가 기름기를 뺀 리스트라면 이건 건강한 음식인 list이다. 이 list는 이중 연결 리스트, doubly-linked list 구조로 되어 있다. 때문에 prev를 가리키는 포인터가 있기에 더 메모리를 먹는다는 점부터 알고 시작하자. 다시 말해서 데이터, 다음 노드를 가리키는 포인터, 이전 노드를 가리키는 포인터 3가지를 가지고 있다는 것이다. forward_list와 list의 차이점은 list에서 _after로 끝나는 함수들이 이제는 after가 없어진다. insert_after -> insert emplace_after -> emplace 왜냐하면 원소 이동을 역방향으로도 가능하니까 원소 삽입이나 삭제를 위해 특정 원소의 이전 원소 반복자를 제공하지 않아도 되니까..? ..

CS Interview 2021.06.15

C++에서 반복자, iterator의 차이

연결된 구조, 연속된 구조에서 둘 다 반복자, iterator를 쓰지만 서로 다르게 구현되어 있다. 그도 그럴 것인게.. 메모리 주소 접근 방식을 생각해보면 쉽다. 단일 메모리 블럭에 들어있는 주소에 접근과 여러 메모리 블럭에 퍼져있는 주소에 접근하는 것은 다를게 분명하기 때문이다. 배열이나 벡터에서 우리가 쓰는 iterator는 random access iterator라고 한다. 임의의 위치에 바로 접근이 가능하다. forward_list 에서 쓰는 iterator는 forward iterator라고 한다. **하지만 양방향 연결리스트를 들어봤다면 bidirectional iterator도 있겠네라고 생각할 수 있다. 정확하게 맞다. 아무튼 위 연결된 구조 연속된 구조와 다르게 임의의 위치에 바로 접근..

CS Interview 2021.06.15

C++ 에서의 자료구조 forward_list를 쓰는 이유

배열과 벡터같은 얀속된 자료 구조에서는... 임의의 위치에서 삽입 삭제가 비효율적이고 말할 수 있다. 즉, 연결된 자료구조를 C++이 제공하느냐?? **list도 있지만 list에서 뺄 것을 빼서 기름기가 쫙빠진 것이 forward_list라고 할 수 있다. 그렇다. 제공한다. 그것이 바로 forawrd_list이다. 연결리스트의 성능은 유지하면서 추가적인 기능을 제공한다. 하지만 성능 유지를 위해 임의의 위치에 대한 직접 접근을 허용하지 않으며 전체 리스트의 크기를 바로 알 수는 없다. 즉, 맨 처음 원소에 접근하는 front()는 제공하지만 맨 뒤의 원소에 접근하는 back()같은 것은 지원하지 않는다. 그리고 연결된 구조와 연속된 구조의 iterator, 반복자는 종류가 다름을 생각하자 forwar..

CS Interview 2021.06.15

C++ 에서의 자료구조 Array 대신 Vector를 쓰는 이유

C++에서는array도 제공하지만 vector도 제공한다. 왜 우리는 vector를 쓰는가? 우선 array는 컴파일할 때 크기가 결정된다. 즉, 미리 알고 선언해야한다는 말이다. 크기가 고정되어있으므로 원소의 데이터는 바꿀 수 있어도 원소를 추가하거나 삭제하는 일은 불가능하다. 또한 컴파일할 때 크기가 결정되므로 무조건 스택 메모리를 사용한다. 솔직히 거의 모든 응용프로그램에서는 데이터가 동적이며 크기도 고정되어 있지 않은 게 현실이다. 때문에 데이터의 크기를 미리 알고 있는 것은 어렵다 **다만 메모리가 많다면 미리 선언하는 것도 나쁘지는 않다고 본다. 하지만 효율적인 활용을 위해선, 위 상황을 제외하면 가변 크기의 데이터 컨테이너가 있었으면 좋겠다고 생각한다. 바로 그것이 vector이다. //1...

CS Interview 2021.06.15

C++ 에서의 자료구조 Array vs Linked List; 배열과 연결리스트

기본 중에 기본부터 알아보자 응용프로그램을 설계할 때 가장 중요하게 고려해야 할 점 중 하나인 데이터 관리는 매우 중요하다. 즉, 우리는 응용 프로그램에 적합한 자료 구조를 사용하는 것이 정말 중요하다. 해결하고자 하는 문제에 적합한 자료구조를 이용하는 것이 응용프로그램 개발에 도움이 된다. 기본 내장 자료구조가 한계가 있다면 우리는 사용자 정의 자료 구조를 구현해야 한다. -> 결국 자료구조를 배우면서 어떤 문제를 해결하는 데에 어떤 자료구조가 필요할 것인가? 임을 배우는 것이 자료구조를 배우는 목적이라고 하겠다. C++에는 자료구조 중 대표적으로 선형 자료구조(Linear Data Structure)가 있다. 선형 자료구조는 또 다시 2가지로 나뉘는데 연속된 구조와 연결된 구조로 나눌 수 있다. (C..

CS Interview 2021.06.15

백준, BOJ, 16236번 C++ [CPP]

아.. 자그마한 문제가 큰 에러를 만든다. https://www.acmicpc.net/problem/16236 #맞는 풀이 #include #include #include #include #define X first #define Y second using namespace std; // 위, 왼, 아, 오 순 int dx[4] = { 0,-1,0,1 }; int dy[4] = { 1,0,-1,0 }; struct Fish { int x; int y; int value; }; int N; int map[21][21]; // 맵 int visited[21][21]; // 방문(초기값 -1) int x, y; // 아기상어 초기 위치 int mag = 2; // 아기상어 초기 크기 int bite = 0; ..

728x90
반응형