본문 바로가기

CS/코딩테스트(C++)13

[C++ STL] Vector에서 assign과 resize 차이 Vector 컨테이너에서 assign 함수와 resize 함수의 차이를 알아보겠습니다.assign 함수란?벡터의 기존 내용을 삭제하고 새로운 크기와 원소값으로 초기화하는 함수크기와 초기화 값을 인자로 받음혹은 iter 시작값, 끝값을 입력받음 (set 자료구조의 값을 vector로 옮겨오는 식으로 응용가능)예)v.assign(n, 5); // n의 크기만큼 5로 초기화// iterator 값이 들어올 경우set s;// ~// s에 값 입력// ~v.assign(s.begin(),s.end());(set 자료구조의 값을 vector로 옮겨오는 식으로 응용) resize 함수란?벡터의 기존 내용을 유지한 채로 크기만 변경하는 함수기존 크기보다 작아질 경우, 크기를 초과하는 원소 값은 제거됨기존 크기보다 커.. 2025. 1. 14.
[C++ STL] Vector 초기화 시 비용 절감 방법 vector 클래스 초기화 시 비용(시간, 메모리) 절감을 위한 방법을 알아보겠습니다.vector의 초기화?vector v(크기, 값)의 형태이다.크기만 지정할 경우 모든 원소를 0으로 초기화한다.// 크기만 지정하면 모든 원소는 기본값인 0으로 초기화된다.vector v(5);vector v2(5,0); // 크기 5, 모든 원소를 0으로 초기화if (v == v2) cout 위 코드에서 v와 v2가 같다는 것을 알 수 있습니다. 초기화 시 비용 절감 방법?선언만 할 경우 size, capacity 모두 0이다.벡터의 capacity보다 원소의 수가 많아질 경우, 메모리를 재할당하는 작업을 거친다.선언 후 push_back으로 원소를 삽입하면 메모리를 재할당하는 작업이 자주 일어나므로 불필요한 비용 소.. 2025. 1. 1.
[C++] 주소에 의한 호출, 참조에 의한 호출 (Call by Address, Reference), 포인터로 객체 멤버 접근하기 1. C++에서 함수 호출 시 인자를 넘겨줄 수 있는 방법들을 알아보겠습니다.2. 포인터로 클래스의 멤버를 접근할 때 사용하는 연산자(->, .)의 차이를 정리해 보겠습니다.값에 의한 호출?call by value함수 호출 시 인자로 들어온 값을 복사해서 사용호출된 함수에서 연산을 거쳐도 인자에 영향을 주지 않음예)void swap(int x, int y) // 함수 구현부{ // 내용}swap(input1, input2); // 함수 호출 형태 주소에 의한 호출?call by address새롭게 변수를 생성하고 그곳에 값을 저장하는 것이 아니므로 자원을 절약할 수 있음. (메모리, 시간)함수 호출 시 주소 값을 인자로 받음호출할 함수의 매개변수를 포인터 형태로 구현호출된 함수에서 들어온 인자로 연산을 .. 2024. 12. 30.
[C++ STL] Pair 클래스 사용하기 Pair 클래스를 통해 두 종류의 데이터 타입을 묶어서 사용할 수 있다.구조체를 구현하지 않고도 간단하게 데이터 쌍을 만들 수 있다.pair 클래스?두 개의 데이터 타입을 하나로 묶어 저장하기 위해 사용pair p로 생성할 수 있다..first, .second로 해당 인자에 접근할 수 있다.vector와 같은 컨테이너에도 사용할 수 있다.예) pair p;vector> v;1. 필요한 라이브러리 #include // utility 헤더는 vector와 algorithm 헤더에도 포함됨.// 혹은#include // 혹은#include pair 클래스는 utility 헤더에 포함되어 있다.uitility 헤더는 vector 헤더나 algorithm 헤더에도 포함되기 때문에 다른 헤더를 사용해도 된다.2... 2024. 12. 29.
[C++] fixed와 precision로 소수 특정 자릿수까지 출력하기 C++에서 cout.precision() 함수와 fixed를 사용하여 출력할 자릿수를 지정할 수 있다.precision 함수란?정수 부분을 포함하여 n개의 숫자를 나타냄실수형의 경우 소숫점 이하 자리수 중 출력 범위를 넘어서는 부분에서 반올림한다. (4자리 출력 시 123.456 → 123.5)fixed와 같이 사용하면 소숫점 이하 출력 자릿수를 고정할 수 있다.fixed를 해제하려면 cout.unsetf(ios::fixed);를 사용.예)cout.precision(n);cout cout.unsetf(ios::fixed);1. 필요한 라이브러리 #include2. 실수형 변수 선언double db = 3.14159;3. 출력 및 자리수 설정// 기본 출력cout 4. 전체 소스 코드#include usi.. 2024. 12. 26.
[C++] getline() 특정 문자가 들어올 때까지 입력 받기 cin으로는 띄어쓰기와 개행문자(Enter, 줄 바꿈), 탭을 문자열에 저장할 수 없다.이런 문제는 cin 대신 getline을 사용하여 해결할 수 있다.getline란?getline을 사용하면 띄어쓰기와 개행문자 등을 문자열에 저장할 수 있다.입력되는 문자열 중 특정 문자가 입력될 때까지만 저장할 수도 있다.cin.getline(), getline() 등의 형태가 있다.예시)문자열 "happy birthday" 입력 시 'y'가 입력되기 전까지만 저장하면, 문자열에는 "happ" 까지만 저장된다.'d'가 입력되기 전까지 저장하면, 문자열에는 "happy birth"가 저장된다.1. 필요한 라이브러리#include #include // 보통 문자열 입력 시 많이 사용하므로 함께 사용string 대신 c.. 2024. 12. 12.
[C++] 시간복잡도 상수배 관련 최적화 요소들 시간복잡도for문 vs 범위 기반 for문(범위 기반 for문의 경우 배열 값을 참조)예) auto &i : array; cin >> i; - 유의미한 차이 없음, auto 형식 추론 키워드도 마찬가지메모리 사용량*vector는 C++ STL에서 지원하는 컨테이너다. [vector 입력 방식]// 코드 1// n은 사전에 입력됨vector v;for(int i = 0; i > tmp; v.push_back(tmp);}vs// 코드 2// n은 사전에 입력됨vector v(n);for(int i = 0; i > v[i];}코드1보다 코드2가 메모리 사용량 유의미하게 절감됨. 2024. 11. 20.
[C++] 범위 기반 for문 (feat. auto 선언 지정자) 범위 기반 for문이란?c++ 11 이후에 추가된 반복문이다.배열과 같은 컨테이너에 사용하며, 내부 요소를 반복하기 적합하다.배열, vector, list, set, map 등의 컨테이너에 사용할 수 있다. 형식)// element_declaration - 배열 요소와 같은 자료형이 아니면 형 변환 발생for (element_declaration : array) // array : 컨테이너, element_declaration : 배열 요소를 복사할 변수 statement; // statement : 내용array의 배열 요소를 복사하여 element_declaration에 넣는다고 보면 된다.element_declaration = array[i]; // i = 0, 1, 2, ...  사용 예제).. 2024. 11. 19.
[C++ STL] 이진 탐색과 순차 탐색의 시간복잡도 C++ STL의 algorithm 라이브러리에서 제공되는 코드를 사용합니다. 정렬 함수 : O(n log n)sort, stable_sortunique, erase : O(n) 이진 탐색 : O(log n)배열이 정렬된 상태에서 사용해야 함, 이진 탐색 트리(Binary search tree)binary_search, lower_bound, upper_bound 순차 탐색 : O(n)정렬되지 않아도 사용가능find 등..참고자료https://velog.io/@jimojjing/CSTL-sethttps://velog.io/@zeouscik/C-STL-%EC%A0%95%EB%A6%AC 2024. 11. 14.
[C++ STL] sort와 stable_sort sort 함수란?퀵 정렬, 힙 정렬, 삽입 정렬을 섞은 인트로 정렬 함수다.퀵 정렬은 최악의 경우 시간복잡도가 O(n^2)이지만, 인트로 정렬은 퀵 정렬의 단점을 보완해 어떠한 경우에도 O(n log n)이 보장된다.인자로 1. 시작 범위(포함), 2. 끝범위(미포함), 3. 비교규칙을 받음예)// 벡터 v가 있다고 가정할 때,sort(v.begin(), v.end(), compare); // 벡터일 경우 begin(), end() 사용 가능// 혹은sort(v, v+n, compare); // 일반 배열// n은 배열 크기로, v.size() 등으로 대체 가능  stable_sort 함수란?안정 정렬 함수로, 크기가 같은 원소들의 상대적 위치가 정렬 후에도 바뀌지 않는 함수받는 인자는 sort와 동일하.. 2024. 11. 14.
[C++] 큰 배열 선언 시 주의사항 함수 내에서 선언되는 배열의 경우 스택 영역에 생성된다. 함수가 호출될 때마다 해당 배열을 위한 메모리를 새로 생성하고 초기화하는 작업을 하기 때문에 배열의 크기가 큰 경우에는 다른 방법을 사용해야 한다.함수 내에서 크기가 큰 배열을 생성할 경우 생기는 문제점배열을 초기화하는 경우 함수가 호출될 때마다 값을 채워 넣어야 하기 때문에 프로그램의 수행 속도가 느려질 수 있다. 특히나 자주 호출되는 함수인 경우에는 프로그램의 속도를 치명적으로 느리게 만들 수도 있다.이론적으로 스택 -- 지역 자동변수가 저장되는 영역의 크기는 제한되지 않지만, 시스템에 따라 하드웨어적인 제한이나 스택 운영의 효율을 높이기 위해 스택의 크기를 제한하기도 한다. 그렇기 때문에 함수 내에서 선언되는 배열의 크기가 과도하게 큰 경우 .. 2024. 11. 14.
[C++ STL] vector에서 중복 문자 제거하기 중복문자를 제거하기 위해 unique와 erase 함수를 사용할 수 있다.unique 함수란?vector 배열에서 중복되지 않는 원소들을 앞에서부터 채워나가는 함수다.중복되지 않는 원소들을 앞에서부터 채워나가는 역할을 하기때문에 남은 뒷부분은 그대로 vector 원소값이 존재한다.예)vector 배열 원소값12234567772222unique 적용 후12345672772222 erase 함수란?erase 함수는 vector 배열에서 특정 원소를 삭제하는 함수다.v.erase(v.begin()+s, v.begin()+e) 명령어를 입력하면 [s,e) 원소가 삭제된다. 시작 지점은 닫힌구간, 끝나는 지점은 열린 구간으로 삭제된다1. 필요한 라이브러리 #include#include#include#include.. 2024. 11. 13.