mapsetunordered_mapcount(), insert(), erase()map[key] 자동 생성countMap[n]++for (int num : arr) 정도면 충분. int는 굳이 const int&까지 안 써도 됨.push_back(), sort() 같은 동작 분기는 그냥 if로 쓰기.sort(answer.begin(), answer.end()) 하면 기본 오름차순 정렬.vector에서 찾기는 보통 끝까지 봐야 해서 O(n), map 검색 / 삽입 / 삭제는 O(log n).unordered_map은 정렬 안 되지만 평균 검색 속도 O(1).m["key"]는 없는 key를 읽기만 해도 기본값으로 생성.countMap[n]++ 패턴TMap, TSethttps://school.programmers.co.kr/learn/courses/30/lessons/12910
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr, int divisor) {
vector<int> answer;
for(const int& num: arr)
{
if(num%divisor==0)
{
answer.push_back(num);
}
}
answer.empty() ? answer.push_back(-1) : sort(answer.begin(), answer.end());
return answer;
}
for(const int& num: arr): int 같은 작은 타입은 const & 까지 할 필요 없다. 걍 복사해도 부담없음.answer.empty() ? answer.push_back(-1) : sort(answer.begin(), answer.end());: 삼항연산자를 action 용으로 쓰면 겁나 길어진다. 값 고를 때만 쓰자. if() 문으로 해결.vector.empty()sort(vector.begin(), vector.end()): 비교함수 없이 sort 하면 오름차순.O(n). 벡터의 find 시간복잡도 대...충 이 알고리즘이 어느 정도 시간이 걸리는지. 입력크기에 따라 연산 횟수가 어떻게 증가하는지.
Big O 표기법(점근 표기법)으로 표기함.

vector는 O(n), map은 O(log n)
find, substr, replace 있다.char) - 'A'는 65, 'a'는 97vector<pair<string, int>> 형식으로 이름-전화번호를 저장한다 치자. 검색하려면 처음부터 하나씩 비교 -> 1만 명이면 최대 1만 번 검색해야 함.map은 key - value 쌍을 저장하는 자료 구조. key는 이름표(찾는 기준), value는 실제 데이터.map<string, int> scores;
scores["김철수"] = 78;
scores["김철수"];
key 기준 자동 정렬. 넣은 순서가 아니라 key의 오름차순.O(log n)| 연산 | 설명 | 시간 복잡도 |
|---|---|---|
m["key"] = value | 삽입 또는 수정 | |
m["key"] | 값 읽기 (주의!) | |
m.count("key") | 존재 여부 (0 또는 1) | |
m.erase("key") | 삭제 | |
for (auto& p : m) | 순회 (p.first / p.second) |
[]로 읽기만 해도 기본값 (int라면 0)으로 자동 생성. 의도치 않게 map 크기가 늘어나는 버그를 원인count 로 존재여부 확인 후 읽기!map<int, int> countMap;
for(int n: numbers)
{
countMap[n]++;
}
numbers 배열에 k가 몇개 들어가는지 체크를 할 때 이렇게 하면
1. 숫자 k 처음 만났을 때 countMap[k] 값 읽기 -> 값 없으니 초기값으로 생성 -> 0으로 생성 -> ++ 해서 1 됨.
2. 다음에 만났을 때 ++ -> 1개 추가.
이런 식으로 카운팅 가능함. 이후 countMap[k] 하면 갯수 확인 가능
map 이 사전이라면 set은 출석부insert, count, erase 가능map | unordered_map |
|---|---|
| 내부 구조: 이진 탐색 트리 | 내부 구조: 해시 테이블 |
| 검색 속도: | 검색 속도: 평균 |
| 순회 순서: key 정렬 순 | 순회 순서: 보장 없음 |
| 용도: 정렬이 필요할 때 | 용도: 빠른 검색만 필요할 때 |
O(1)!!)fruits["apple"] = 1500; 식으로 [] 쓰기.fruits.insert({"apple", 9999}); 식으로 쓰기. 덮어쓰기 하지 않는다.count()로 확인 후 [] 로 검색하기.count()는 해당 key가 있으면 1, 없으면 0 반환erase() 는 키 지정해서 삭제.카운팅 패턴
v[3] 하면 메모리에서 바로 3번 칸 찾아냄. 숫자 인덱스로 바로 접근하기 때문.key는 다른데 해시값은 같은 경우가 있다 = 해시 충돌O(n). 보통 충돌 드물어 평균 O(1)map 과 unordered_map 은 내부 구조가 이진 탐색 트리/해시 테이블로 다르다.map, 퀘스트 완료 여부 set...TMap TSet 제공. 태그가 보통 Map이다.