From e7c44e5a20c6d6f6fdb1a4c7f514e7fa24b59a3c Mon Sep 17 00:00:00 2001 From: yeoju Date: Fri, 23 May 2025 03:30:25 +0900 Subject: [PATCH] Feat: #234 #244 #259 #267 --- clone-graph/crumbs22.cpp | 60 +++++++++++++++++++ .../crumbs22.cpp | 34 +++++++++++ palindromic-substrings/crumbs22.cpp | 30 ++++++++++ reverse-bits/crumbs22.cpp | 14 +++++ 4 files changed, 138 insertions(+) create mode 100644 clone-graph/crumbs22.cpp create mode 100644 longest-repeating-character-replacement/crumbs22.cpp create mode 100644 palindromic-substrings/crumbs22.cpp create mode 100644 reverse-bits/crumbs22.cpp diff --git a/clone-graph/crumbs22.cpp b/clone-graph/crumbs22.cpp new file mode 100644 index 000000000..7270cd3b2 --- /dev/null +++ b/clone-graph/crumbs22.cpp @@ -0,0 +1,60 @@ +#include +#include + +using namespace std; + +class Node { +public: + int val; + vector neighbors; + Node() { + val = 0; + neighbors = vector(); + } + Node(int _val) { + val = _val; + neighbors = vector(); + } + Node(int _val, vector _neighbors) { + val = _val; + neighbors = _neighbors; + } +}; +/* + std::vector v; + + v.emplace_back(arg1, arg2, ...); // 생성자 인자를 바로 전달해 컨테이너 안에서 직접 T 객체를 생성 +*/ + +#include +#include + +class Solution { + public: + Node* cloneGraph(Node* node) { + if (!node) + return (nullptr); + unordered_map m; + queue q; + + m[node] = new Node(node->val); // 시작 노드를 복제하고 맵과 큐에 등록 + q.push(node); + + // BFS + while (!q.empty()) { + Node* cur = q.front(); + q.pop(); + + for (Node* nei : cur->neighbors) { + + // 아직 복제하지 않은 노드일 때 + if (!m.count(nei)) { + m[nei] = new Node(nei->val); + q.push(nei); + } + m[cur]->neighbors.push_back(m[nei]); // 현재 복제본에 이 이웃의 복제본을 연결 + } + } + return m[node]; + } + }; diff --git a/longest-repeating-character-replacement/crumbs22.cpp b/longest-repeating-character-replacement/crumbs22.cpp new file mode 100644 index 000000000..b1c408b33 --- /dev/null +++ b/longest-repeating-character-replacement/crumbs22.cpp @@ -0,0 +1,34 @@ +#include +#include +using namespace std; + +/* + 시간 복잡도 : O(n) + 공간 복잡도 : O(1) + + 구간 길이 windowSize = (right - left + 1)에서, + windowSize - maxCount <= k 이면 이 구간을 모두 같은 문자로 만들 수 있다 + windowSize - maxCount > k 이면 교체가능한 횟수가 초과되었으므로 left를 한 칸 밀어서 구간을 줄인다 +*/ +class Solution { + public: + int characterReplacement(string s, int k) { + int left = 0; + int maxCount = 0; + int answer = 0; + int count[26] = {0}; + + for (int right = 0; right < s.size(); right++) { + + count[s[right] - 'A']++; + maxCount = max(maxCount, count[s[right] - 'A']); // 윈도우 안에서 가장 많은 빈도를 갱신 + while (right - left + 1 - maxCount > k) { + count[s[left] - 'A']--; + left++; + } + answer = max(answer, right - left + 1); + + } + return (answer); + } + }; diff --git a/palindromic-substrings/crumbs22.cpp b/palindromic-substrings/crumbs22.cpp new file mode 100644 index 000000000..d817bdb54 --- /dev/null +++ b/palindromic-substrings/crumbs22.cpp @@ -0,0 +1,30 @@ +#include + +using namespace std; + +/* + 중심 확장 방식 + 전체 문자열길이 n에 대해서 + - 홀수 길이용 n개 + - 짝수 길이용 n - 1개 + 전체 2n - 1개의 중심에서 각 양쪽으로 확장하며 카운트 +*/ +class Solution { +public: + int countSubstrings(string s) { + int answer = 0; + int n = s.size(); + + for (int center = 0; center < 2 * n - 1; center++) { + int left = center / 2; + int right = left + (center % 2); + + while (left >= 0 && right < n && s[left] == s[right]) { + answer++; + left--; + right++; + } + } + return (answer); + } +}; diff --git a/reverse-bits/crumbs22.cpp b/reverse-bits/crumbs22.cpp new file mode 100644 index 000000000..1d57f5691 --- /dev/null +++ b/reverse-bits/crumbs22.cpp @@ -0,0 +1,14 @@ +#include + +class Solution { + public: + uint32_t reverseBits(uint32_t n) { + unsigned int reverse = 0; + for (int i = 0; i < 32; i++) { + reverse <<= 1; // 한 비트를 왼쪽으로 당겨서 공간을 만들고 + reverse |= (n & 1); // n의 최하위 비트를 reverse의 최하위 비트에 저장 + n >>= 1; // n의 다음 비트를 최하위 비트로 당겨온다 + } + return (reverse); + } +};