[Algorithm] 델타값을 이용한 상하좌우 탐색
·
Programming/Algorithm & Data Structure
https://www.acmicpc.net/problem/1012 백준 1012 문제를 풀다가 나온 스킬이다. 자주 사용되므로 숙지해두자. 문제에서 2차원 배열에 있는 모든 원소를 하나씩 살펴보면서 그 원소의 상하좌우 원소도 검사하는 작업이 있었다.여기에서 반복문을 통해 x와 y에 델타값을 더해 매우 편하게 상하좌우 탐색을 할 수 있다. 구현 순서는 다음과 같다. (이 정도는 외우자)탐색에 사용할 델타값 배열 만들기기존 좌표에 델타값을 더한 새로운 좌표 구하기새로운 좌표가 배열 인덱스 범위 안에 있는지 검사하기전체 코드는 다음과 같다. (DFS 코드 안에 들어가 있으므로 for문 안쪽만 보면 된다)// 탐색에 사용할 델타값// 상, 하, 좌, 우 순서로 이동int dy[4] = {-1, 1, 0, 0};..
[C++ STL] 연관 컨테이너와 셋(Set)
·
Programming/C++
연관 컨테이너(associative container)란?이전에 배운 시퀀스 컨테이너가 단순하게 순차적으로 자료를 저장하는 구조라면, 연관 컨테이너는 각 원소가 키(key) - 값(value)의 구조를 가지는 컨테이너다. 특정한 키를 넣으면 이에 대응되는 값을 돌려준다.연관 컨테이너는 대표적으로 다음과 같은 작업을 수행한다.특정 키가 연관 컨테이너에 존재하는가?특정 키에 대응되는 값은 무엇인가?첫 번째 작업에는 셋(set)과 멀티셋(multiset), 두 번째 작업에는 맵(map)과 멀티맵(multimap)을 사용한다.맵의 경우 셋보다 사용하는 메모리가 많으므로 단순히 키의 존재 유무만 궁금하다면 셋을 사용하는 것이 좋다.나머지는 차차 알아보도록 하고, 먼저 셋부터 알아보자.개요셋은 원소들을 저장하지만 ..
[백준 1874] 스택 수열
·
Programming/PS
입출력 속도 때문에 하루 종일 푼 문제입출력 속도에 대한 내용은 여기에서 볼 수 있다.2024.07.31 - [Programming/C++] - C++ 입출력 속도 높이기 C++ 입출력 속도 높이기파이썬으로 알고리즘 문제를 풀기 시작해서 얼마 안 돼 C++로 전환했는데, 이상하게 시간 초과가 뜨는 문제가 많이 보였다. 간단한 문제임에도 계속 시간 초과가 나서 하루 종일 해결을 못 했는kkj4818.tistory.com 문제https://www.acmicpc.net/problem/1874코드// 처음에 푼 풀이// 코드가 난잡함#include #include using namespace std;int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.ti..
C++ 입출력 속도 높이기
·
Programming/C++
파이썬으로 알고리즘 문제를 풀기 시작해서 얼마 안 돼 C++로 전환했는데, 이상하게 시간 초과가 뜨는 문제가 많이 보였다. 간단한 문제임에도 계속 시간 초과가 나서 하루 종일 해결을 못 했는데, 알고보니 C++의 cin, cout이 문제였다. cin과 cout은 scanf와 printf보다 현저히 느리다고 한다. 이런 경우에는 다음 코드를 사용하면 cin과 cout의 속도를 개선할 수 있다고 한다.// include와 네임스페이스 using 지시문 생략ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);또한 endl보다 \n를 사용하는 것이 더 빠르다. (백준 1874번 문제를 이거 때문에 시간 초과 떠서 하루 종일 못 풀었었다;;) 다만 주의할 점이 있..
[C++ STL] 덱 (Deque)
·
Programming/C++
개요벡터와 비슷하지만 양방향으로 원소를 삽입 / 제거할 수 있는 컨테이너시간 복잡도임의 위치 원소 접근: O(1)맨 앞/뒤에 원소 추가 및 제거: O(1)중간에 원소 삽입 및 제거: O(n)벡터보다 빠르게 동작함주요 기능 및 특징벡터보다 빠른 이유 (덱의 구조)덱은 벡터와 다르게 원소들이 실제로 메모리 상에서 연속적으로 존재하지 않는다. 이 때문에 원소들이 어디에 저장되어 있는 지에 대한 정보를 보관하기 위해 추가적인 메모리를 더 필요로 한다. (즉, 덱은 속도를 위해 메모리를 희생함)덱의 원소들은 일정 크기로 잘려서 각각의 블록에 저장된다. 그리고 그 블록들의 시작 주소를 가리키는 포인터들의 벡터가 존재한다.  크기를 늘리는 경우에서도 차이를 보이는데, 벡터의 경우 벡터가 가득 찬 상태에서 새로운 원소..
[C++ STL] 리스트 (List)
·
Programming/C++
개요양방향 연결 구조를 가진 자료형양방향 연결 리스트와 같은 구조 벡터와 달리 임의의 위치에 있는 원소에 접근할 수 없음리스트는 시작 원소와 마지막 원소의 위치만 기억하고 있기 때문시작 또는 마지막 위치에서 반복자가 한 칸씩 움직이는 방식으로만 접근할 수 있다. 양방향 연결 리스트와 같이 각각의 원소들이 링크로 이어져 있기 때문에 실제 메모리 상에서 연속적으로 존재하지 않을 수 있다.시간 복잡도중간에 원소 삽입 / 제거:O(1)연결 관계만 바꿔주면 되기 때문에 매우 빠름주요 기능 및 특징반복자리스트의 반복자의 타입은 BidirectionalIterator 타입이다.이 반복자는 양방향으로 이동할 수 있되, 한 칸씩만 이동 가능하다.++ / -- 연산리스트의 반복자에 ++, --를 사용해 반복자를 왼쪽 / ..
[C++ STL] 반복자 (Iterator)
·
Programming/C++
개요컨테이너에서 원소에 접근할 수 있게 하는 포인터같은 객체벡터에서 []을 사용해 원소에 접근할 수 있지만, 반복자를 사용해 접근하는 것이 올바른 방법이다.STL에 있는 컨테이너들에는 iterator 멤버 타입으로 정의되어 있다. 이후 내용은 벡터를 통해 반복자를 설명한다.begin()과 end()begin(): 컨테이너의 첫 번째 원소를 가리키는 반복자를 리턴end(): 컨테이너의 마지막 원소 한 칸 뒤를 가리키는 반복자를 리턴빈 벡터를 begin() == end()로 표현하기 때문에 한 칸 뒤를 가리키게 함// 반복자 사용 예시#include #include int main() { std::vector vec; vec.push_back(10); vec.push_back(20); ..
[C++ STL] 벡터 (Vector)
·
Programming/C++
개요가변 길이 배열이라고 생각하면 된다.벡터 내부의 원소들이 실제로 메모리에서 연속적으로 저장되어 있다.시간 복잡도임의 위치 원소 접근 (at, []): O(1)맨 뒤에 원소 삽입 및 제거 (push_back, pop_back): O(1)엄밀하게 말하자면 amortized O(1) (amortized는 분할 상환이라는 뜻)보통 벡터는 현재 가지고 있는 원소의 개수보다 더 많은 공간을 미리 할당해 놓음 (부족할 때마다 2배씩 늘리는 방식)이런 상태에서 원소를 삽입하면 O(1)로 작동하지만, 만약 벡터가 꽉 차서 벡터의 공간을 늘려야 하는 경우 크기가 두 배인 새로운 벡터를 만들고 기존 벡터에 있는 모든 값들을 복사하는 작업을 하게 되므로 O(n)의 시간 복잡도가 소요됨다만, 이것을 평균적으로 보았을 때는 ..
snwdaaa
dev_log