int Three::lengthOfLongestSubstring(std::string s)
{
//// 중복되는게 있으면 거기서부터 앞에 있는 중복 없는 Substring 만들기
//// 중복되는게 없으면 maxLen 갱신 시도
//int strLen = s.length();
//int startIdx = 0;
//int maxLen = 0;
//std::unordered_set<char> checklist;
//for (int i = 0; i < strLen; i++)
//{
// // 중복 못 찾았다면 추가
// if (checklist.find(s[i]) == checklist.end())
// {
// checklist.insert(s[i]);
// }
// // 중복 찾았다면 substring 갱신
// else
// {
// for (int j=startIdx; j<i; j++)
// {
// if (s[i] == s[j])
// {
// startIdx = j + 1;
// break;
// }
// else
// {
// checklist.erase(s[j]);
// }
// }
// }
// maxLen = std::max(i - startIdx + 1, maxLen);
//}
//return maxLen;
// 슬라이딩 테이블
// ASCII 테이블을 만들고 등장했던 인덱스를 기록
// right를 올려가며 최대 길이 (right - left) 갱신
// right의 테이블 값과 중복이 있다면 (테이블 값이 -1이 아니라면) left = 중복값 인덱스 + 1
vector<int> table(256, -1);
int left = 0;
int s_len = s.size();
int maxLen = 0;
for (int right = 0; right < s_len; right++)
{
if (table[s[right]] != -1 && left <= table[s[right]])
{
left = table[s[right]]+1;
}
table[s[right]] = right;
maxLen = max(maxLen, right - left + 1);
}
return maxLen;
}
int table[256] = {0};은 모든 요소를 0으로 초기화하지만, int table[256] = {-1}은 모든 요소를 -1로 초기화시키지 않는다. 첫번째 요소만 초기화시킨다.std::vector, std::list
vector : 동적 배열
list : 이중 연결 리스트
| 항목 | std::vector | std::list |
|---|---|---|
| 내부 구조 | 연속된 배열 (contiguous memory) | 이중 연결 리스트 (doubly linked list) |
| 메모리 구조 | 데이터가 한 덩어리로 붙어 있음 | 데이터가 노드별로 흩어져 있음 |
| 인덱스 접근 | 빠름 (O(1)), v[i] 가능 | 느림 (O(n)), l[i] 불가능 |
| 삽입/삭제 (중간) | 느림 (O(n)), 이동 발생 | 빠름 (O(1)), 포인터만 바꿈 |
| 끝 삽입/삭제 | 빠름 (O(1) 또는 amortized O(1)) | 빠름 (O(1)) |
| 캐시 친화성 | 높음 | 낮음 |
| 사용 목적 | 많이 읽고, 중간 삽입 적은 경우 | 중간 삽입/삭제가 많은 경우 |
std::vector 생성자
explicit vector(size_type count, const T& value);
vector<int> mpp(256, -1);
count: 몇 개 만들지
value: 각 요소 초기값
c-style 배열(int[]), std::array
| 항목 | C-style 배열 | std::array |
|---|---|---|
| 크기 | 고정 | 고정 |
| 크기 정보 유지 | 함수 인자로 전달 시 사라짐 | 유지됨 (.size() 가능) |
| 복사 | 불가능 | 가능 (= 연산 가능) |
| 범위 체크 | 없음 | .at()은 체크함 |
| STL 호환 | ❌ | ✅ |
최대값
#include <algorithm>
int a = 5, b = 10;
int maximum = std::max(a, b);
세 개 이상 값 비교할 땐
int m = std::max({a, b, c});
또는 std::max_element 사용
#include <algorithm>
#include <vector>
std::vector<int> v = {3, 8, 1, 6};
int maxVal = *std::max_element(v.begin(), v.end()); // 8
char
char는 1바이트(8비트), 0~255 (부호 없을 경우)
ASCII : 0~127에 매핑된 문자 집합
0~127 : 기본적으로 제어 문자, 공백, 숫자, 대소문자 영어 알파벳, 특수문자로 표현됨
128~255 : 플랫폼 따라 들어있는거 다름
char 종류
| 타입 | 부호 여부 | 범위 |
|---|---|---|
char | 플랫폼에 따라 다름 | -128 ~ 127 또는 0 ~ 255 |
signed char | 항상 부호 있음 | -128 ~ 127 |
unsigned char | 항상 부호 없음 | 0 ~ 255 |
UTF-8
| 문자 종류 | 바이트 수 (UTF-8 기준) |
|---|---|
| ASCII 문자 | 1바이트 ('A', '1' 등) |
| 유럽 문자 | 2바이트 (é, ñ 등) |
| 한글, 한자 | 3바이트 (가, 中 등) |
| 이모지 | 4바이트 (😁, 🔥 등) |