From 03b7a2662b47ba1038fd46d7a4eeb1a79fdabe3b Mon Sep 17 00:00:00 2001 From: jaeeunHwang Date: Wed, 4 Oct 2023 11:56:41 +0900 Subject: [PATCH 01/15] 06_greedy_algorithm --- 04_bruteforce/1063.cpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 04_bruteforce/1063.cpp diff --git a/04_bruteforce/1063.cpp b/04_bruteforce/1063.cpp new file mode 100644 index 0000000..e69de29 From c6a716b2a6fbd9314b80b2ffa6a82faba02fc627 Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Sun, 12 Nov 2023 22:23:31 +0900 Subject: [PATCH 02/15] =?UTF-8?q?231112=20=EC=B6=94=EA=B0=80=EC=A0=9C?= =?UTF-8?q?=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" | 1 + "06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" | 1 + "06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" | 1 + 3 files changed, 3 insertions(+) diff --git "a/06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" "b/06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" index 2101576..2797109 100644 --- "a/06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" +++ "b/06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" @@ -2,6 +2,7 @@ #include #include + using namespace std; // 주어진 문자열이 팰린드롬이 될 수 있는지 문자열의 알파벳과 그 개수를 저장한 맵을 통해 체크하는 함수 diff --git "a/06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" "b/06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" index 2101576..0900424 100644 --- "a/06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" +++ "b/06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" @@ -45,6 +45,7 @@ int main() { string name; // 주어진 문자열 map alp_cnt; // 문자열 내 알파벳과 각각의 개수를 저장하는 맵 + // 입력 cin >> name; name_len = name.length(); diff --git "a/06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" "b/06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" index c3bf475..66987d8 100644 --- "a/06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" +++ "b/06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" @@ -58,6 +58,7 @@ pii makeGroundEven(int n, int m, int b, vector>& ground) { * 그 중에서 비용이 최소가 될 때를 찾는다. */ + int main() { int n, m, b; From ed9dee746892563b054127a0f00671d5c9b8880a Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:10:07 +0900 Subject: [PATCH 03/15] =?UTF-8?q?[=ED=88=AC=ED=8F=AC=EC=9D=B8=ED=84=B0]=20?= =?UTF-8?q?11=EC=9B=94=2015=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\355\225\204\354\210\230/14503.cpp" | 71 +++++++++++++++++++ .../\355\225\204\354\210\230/20922.cpp" | 44 ++++++++++++ .../\355\225\204\354\210\230/2531.cpp" | 56 +++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 "11-two-pointer/\355\225\204\354\210\230/14503.cpp" create mode 100644 "11-two-pointer/\355\225\204\354\210\230/20922.cpp" create mode 100644 "11-two-pointer/\355\225\204\354\210\230/2531.cpp" diff --git "a/11-two-pointer/\355\225\204\354\210\230/14503.cpp" "b/11-two-pointer/\355\225\204\354\210\230/14503.cpp" new file mode 100644 index 0000000..d0ffacd --- /dev/null +++ "b/11-two-pointer/\355\225\204\354\210\230/14503.cpp" @@ -0,0 +1,71 @@ +#include +#include + +using namespace std; + +// 북, 동, 남, 서 방향을 나타내는 상수 +const int dx[] = {-1, 0, 1, 0}; +const int dy[] = {0, 1, 0, -1}; + +// 청소 상태를 나타내는 상수 +const int CLEAN = 0; +const int WALL = 1; +const int CLEANED = 2; + +int n, m; // 지도의 크기 +vector> map; // 지도 +int answer = 0; // 청소한 영역의 개수 + +void clean(int x, int y, int direction) { + // 현재 위치 청소 + if (map[x][y] == CLEAN) { + map[x][y] = CLEANED; + answer++; + } + + // 네 방향 탐색 + for (int i = 0; i < 4; ++i) { + int nextDirection = (direction + 3 - i) % 4; // 현재 방향에서 왼쪽으로 회전 + int nx = x + dx[nextDirection]; + int ny = y + dy[nextDirection]; + + // 왼쪽 방향에 아직 청소하지 않은 공간이 있다면 전진 + if (map[nx][ny] == CLEAN) { + clean(nx, ny, nextDirection); + return; + } + } + + // 네 방향 모두 청소가 이미 되어있거나 벽인 경우 후진 + int backwardDirection = (direction + 2) % 4; + int nx = x + dx[backwardDirection]; + int ny = y + dy[backwardDirection]; + + // 후진할 수 있으면 후진 + if (map[nx][ny] != WALL) { + clean(nx, ny, direction); + } +} + +int main() { + // 입력 + cin >> n >> m; + map.resize(n, vector(m)); + + int startX, startY, startDirection; + cin >> startX >> startY >> startDirection; + + for (int i = 0; i < n; ++i) { + for (int j = 0; j < m; ++j) { + cin >> map[i][j]; + } + } + + // 연산 + clean(startX, startY, startDirection); + + // 출력 + cout << answer << '\n'; + + return 0; +} diff --git "a/11-two-pointer/\355\225\204\354\210\230/20922.cpp" "b/11-two-pointer/\355\225\204\354\210\230/20922.cpp" new file mode 100644 index 0000000..19faa05 --- /dev/null +++ "b/11-two-pointer/\355\225\204\354\210\230/20922.cpp" @@ -0,0 +1,44 @@ +#include +#include + +using namespace std; + +int findSolution(const vector& arr, int k) { + int n = arr.size(); + vector frequency(100001, 0); + + int left = 0, right = 0; + int maxLength = 0; + + while (right < n) { + frequency[arr[right]]++; + + // 현재 구간의 서로 다른 숫자의 개수가 k 초과라면 + while (frequency[arr[right]] > k) { + frequency[arr[left]]--; + left++; + } + + // 현재 구간의 길이가 최대인지 확인하고 right 증가 + maxLength = max(maxLength, right - left + 1); + right++; + } + + return maxLength; +} + +int main() { + //입력 + int n, k; + cin >> n >> k; + + vector arr(n); + for (int i = 0; i < n; ++i) { + cin >> arr[i]; + } + + //연산 & 출력 + cout << findSolution(arr, k) << '\n'; + + return 0; +} diff --git "a/11-two-pointer/\355\225\204\354\210\230/2531.cpp" "b/11-two-pointer/\355\225\204\354\210\230/2531.cpp" new file mode 100644 index 0000000..ab1ebf2 --- /dev/null +++ "b/11-two-pointer/\355\225\204\354\210\230/2531.cpp" @@ -0,0 +1,56 @@ +#include +#include + +using namespace std; + +void findSolution(int n, int d, int k, int c, vector& sushi) { + vector check(d + 1, 0); + int crt_ans = 1; + int ans = 0; + + check[c] = 1; + + for (int i = 0; i < k; i++) { + if (check[sushi[i]] == 0) { + crt_ans++; + } + check[sushi[i]]++; + sushi[n + i] = sushi[i]; + } + + for (int i = 0; i < n; i++) { + ans = max(crt_ans, ans); + + check[sushi[i]]--; + + if (check[sushi[i]] == 0) { + crt_ans--; + } + + if (check[sushi[i + k]] == 0) { + crt_ans++; + } + check[sushi[i + k]]++; + } + + cout << ans; +} + +int main() { + ios_base::sync_with_stdio(0); + cin.tie(0); + + // 입력 + int n, d, k, c; + cin >> n >> d >> k >> c; + + vector sushi(n + k); + for (int i = 0; i < n; i++) { + cin >> sushi[i]; + } + + // 연산 & 출력 + findSolution(n, d, k, c, sushi); + + return 0; +} From 1a367bff67575d5f934a26a7f79b0ca52f2d6d7c Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:10:27 +0900 Subject: [PATCH 04/15] =?UTF-8?q?[=ED=88=AC=ED=8F=AC=EC=9D=B8=ED=84=B0]=20?= =?UTF-8?q?11=EC=9B=94=2015=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\353\217\204\354\240\204/20437.cpp" | 60 +++++++++++++++++ .../\353\217\204\354\240\204/2473.cpp" | 64 +++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 "11-two-pointer/\353\217\204\354\240\204/20437.cpp" create mode 100644 "11-two-pointer/\353\217\204\354\240\204/2473.cpp" diff --git "a/11-two-pointer/\353\217\204\354\240\204/20437.cpp" "b/11-two-pointer/\353\217\204\354\240\204/20437.cpp" new file mode 100644 index 0000000..af5b02a --- /dev/null +++ "b/11-two-pointer/\353\217\204\354\240\204/20437.cpp" @@ -0,0 +1,60 @@ +#include +#include +#include + +using namespace std; + +void findSolution(const string& word, int K) { + vector positions[26]; + int min_length = INT_MAX; + int max_length = -1; + + for (int i = 0; i < word.length(); i++) + positions[word[i] - 'a'].push_back(i); + + for (int i = 0; i < 26; i++) { + if (positions[i].size() >= K) { + int left = 0; + int right = K - 1; + + int temp_min_length = positions[i][right] - positions[i][left] + 1; + int temp_max_length = positions[i][right] - positions[i][left] + 1; + + while (right < positions[i].size() - 1) { + right++; + left++; + temp_min_length = min(positions[i][right] - positions[i][left] + 1, temp_min_length); + temp_max_length = max(positions[i][right] - positions[i][left] + 1, temp_max_length); + } + + min_length = min(temp_min_length, min_length); + max_length = max(temp_max_length, max_length); + } + } + + if (min_length == INT_MAX) + cout << -1 << "\n"; + else + cout << min_length << " " << max_length << "\n"; +} + +int main() { + ios_base::sync_with_stdio(false); + cin.tie(NULL); + cout.tie(NULL); + + //입력 + int T; + cin >> T; + + while (T--) { + string word; + int K; + cin >> word >> K; + + // 연산 & 출력 + findSolution(word, K); + } + + return 0; +} diff --git "a/11-two-pointer/\353\217\204\354\240\204/2473.cpp" "b/11-two-pointer/\353\217\204\354\240\204/2473.cpp" new file mode 100644 index 0000000..1e3e8e2 --- /dev/null +++ "b/11-two-pointer/\353\217\204\354\240\204/2473.cpp" @@ -0,0 +1,64 @@ +#include +#include +#include + +using namespace std; +typedef long long ll; +const ll INF = 2e18 + 1; + +/** + * 세 용액의 합이 가장 0에 가까운 용액의 쌍 리턴 + */ + +vector findLiquid(vector& arr) { + int n = arr.size(); + vector result(3, 0); + ll closestSum = INF; + + for (int i = 0; i < n - 2; ++i) { + int left = i + 1; + int right = n - 1; + + while (left < right) { + ll currentSum = arr[i] + arr[left] + arr[right]; + + if (llabs(currentSum) < closestSum) { + closestSum = llabs(currentSum); + result[0] = arr[i]; + result[1] = arr[left]; + result[2] = arr[right]; + } + + if (currentSum < 0) { + left++; + } else { + right--; + } + } + } + + return result; +} + +int main() { + + //입력 + int n; + cin >> n; + + vector arr(n); + for (int i = 0; i < n; ++i) { + cin >> arr[i]; + } + + //연산 + sort(arr.begin(), arr.end()); + vector result = findLiquid(arr); + + //출력 + for (int i = 0; i < 3; ++i) { + cout << result[i] << ' '; + } + + return 0; +} From 9b8f0d41e4f5ce360b238424864cf39fa23bb3df Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:11:53 +0900 Subject: [PATCH 05/15] =?UTF-8?q?Delete=2003=5F=EC=A0=95=EC=88=98=EB=A1=A0?= =?UTF-8?q?/=ED=95=84=EC=88=98=20directory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\355\225\204\354\210\230/1735.cpp" | 38 ---------- .../\355\225\204\354\210\230/2840.cpp" | 67 ----------------- .../\355\225\204\354\210\230/6588.cpp" | 73 ------------------- 3 files changed, 178 deletions(-) delete mode 100644 "03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/1735.cpp" delete mode 100644 "03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/2840.cpp" delete mode 100644 "03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/6588.cpp" diff --git "a/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/1735.cpp" "b/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/1735.cpp" deleted file mode 100644 index 6ef3c47..0000000 --- "a/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/1735.cpp" +++ /dev/null @@ -1,38 +0,0 @@ -#include - -using namespace std; - -// 최대공약수(GCD) 계산 함수: 유클리드 호제법 이용 -int getGCD(int a, int b) { - // 만약 b가 0이면, a가 최대공약수이다. - if (b == 0) return a; - // 그렇지 않으면, b와 a를 b로 나눈 나머지로 재귀 호출한다. - return getGCD(b, a % b); -} - -/* - [백준 1735: 분수 합] - a/b + c/d = (a*d)/(b*d) + (b*c)/(b*d) = (a*d + b*c)/(b*d) - 위 분수를 기약분수로 나타낸 것을 x/y라 하고, - gcd를 (a*d + b*c)와 (b*d)의 최대공약수라 하면 - x = (a*d + b*c) / gcd - y = (b*d) / gcd -*/ - -int main() { - // 입력 - int a, b, c, d; - cin >> a >> b >> c >> d; - - // 연산 - int x = (a * d) + (b * c); // 분자 - int y = b * d; // 분모 - int gcd = getGCD(x, y); - x = x / gcd; // 기약분수의 분자 - y = y / gcd; // 기약분수의 분모 - - // 출력 - cout << x << " " << y; - - return 0; -} diff --git "a/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/2840.cpp" "b/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/2840.cpp" deleted file mode 100644 index a3e6b3f..0000000 --- "a/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/2840.cpp" +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include - -using namespace std; - -typedef pair ic; // pair의 간단한 별칭 정의 -const int ALPHA = 26; // 알파벳의 개수 상수로 정의 - -// index부터 시계방향으로 바퀴에 적어놓은 알파벳 출력 -string printWheel(int n, int index, vector& wheel) { - string ans = ""; - // 바퀴를 돌릴 때와 반대방향으로 출력 - for (int i = index + n; i > index; i--) { - ans += wheel[i % n]; - } - return ans; -} - -// 행운의 바퀴 반환 -string makeWheel(int n, int k, vector& record) { - vector wheel(n, '?'); // 바퀴의 모든 알파벳을 ?로 초기화 - vector is_available(ALPHA, false); // 알파벳 중복 체크 - - int index = 0; // 화살표가 가리키는 인덱스 - - for (int i = 0; i < k; i++) { - int s = record[i].first; // 화살표가 가리키는 글자가 변하는 횟수 - char ch = record[i].second; // 회전을 멈추었을 때 가리키던 글자 - - index = (index + s) % n; // 회전한 후 화살표가 가리키는 인덱스 - - // 해당 칸이 ch로 이미 채워져 있는 경우 넘어감 - if (wheel[index] == ch) { - continue; - } - - // 다른 글자로 채워져있거나 해당 글자가 이미 사용된 알파벳인 경우 ! 반환 - if (wheel[index] != '?' || is_available[ch - 'A']) { - return "!"; - } - - wheel[index] = ch; // 해당 칸에 글자 적기 - is_available[ch - 'A'] = true; // 해당 알파벳이 사용되었으므로 true로 변경 - } - return printWheel(n, index, wheel); -} - -int main() { - ios::sync_with_stdio(false); // C++ 입출력 성능 향상을 위한 설정 - cin.tie(NULL); // cin과 cout의 tie 해제 - cout.tie(NULL); - - // 입력 - int n, k; - cin >> n >> k; - - //record에 값 입력 - vector record(k); - for (int i = 0; i < k; i++) { - cin >> record[i].first >> record[i].second; - } - - // 연산 & 출력 - cout << makeWheel(n, k, record); - - return 0; -} diff --git "a/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/6588.cpp" "b/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/6588.cpp" deleted file mode 100644 index 7e6a1f4..0000000 --- "a/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/6588.cpp" +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include - -using namespace std; - -// 소수 여부 반환 함수: 에라토스테네스의 체 이용 -vector getPrimes(int n) { - vector is_prime(n + 1, true); - is_prime[0] = is_prime[1] = false; - - // 에라토스테네스의 체 알고리즘을 사용하여 소수 여부 판별 - for (int i = 2; i * i <= n; i++) { - if (!is_prime[i]) { - continue; - } - for (int j = i * i; j <= n; j += i) { - is_prime[j] = false; - } - } - return is_prime; -} - -// n = a + b를 만족시키는 a 반환 -int goldbach(int n, vector &is_prime) { - for (int a = 3; a <= n / 2; a += 2) { - // 2보다 큰 짝수 소수는 존재하지 않으므로 - // a = 3부터 탐색해도 a와 b 모두 홀수여야 한다는 조건 만족 - if (is_prime[a] && is_prime[n - a]) { - return a; - } - } - // n = a + b를 만족시키는 홀수 소수 a, b가 없으면 0 반환 - return 0; -} - -/* - [백준 6588: 골드바흐의 추측] - 1. 3보다 크거나 같고 n / 2보다 작거나 같은 소수 a를 오름차순으로 탐색한다. - 2. 1에서 찾은 a에 대하여 n - a(=b)도 소수이면 골드바흐의 추측이 성립한다. - 3. 골드바흐의 추측이 성립하면 a를, 성립하지 않으면 0을 반환한다. -*/ - -int main() { - // 입력 - vector arr; - int input; - - // 0이 입력될 때까지 숫자를 입력받아 벡터에 저장 - while (1) { - cin >> input; - if (input == 0) { - break; - } - arr.push_back(input); - } - - // 연산 - int max_num = *max_element(arr.begin(), arr.end()); - vector is_prime = getPrimes(max_num); - - for (int i = 0; i < arr.size(); i++) { - int a = goldbach(arr[i], is_prime); - - // 출력 - if (a != 0) { // n = a + b를 만족하는 a, b가 존재하면 - cout << arr[i] << " = " << a << " + " << arr[i] - a << "\n"; - } else { // 존재하지 않으면 - cout << "Goldbach's conjecture is wrong.\n"; - } - } - return 0; -} \ No newline at end of file From 262bb26de8dde9bb88829f55d5eceb22fea518ac Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:12:00 +0900 Subject: [PATCH 06/15] Delete 04_bruteforce directory --- 04_bruteforce/1063.cpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 04_bruteforce/1063.cpp diff --git a/04_bruteforce/1063.cpp b/04_bruteforce/1063.cpp deleted file mode 100644 index e69de29..0000000 From 4b18b47495374dfbf573bbe01ad029de1781b232 Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:12:07 +0900 Subject: [PATCH 07/15] =?UTF-8?q?Delete=2006=5Fgreedy=5Falgorithm/?= =?UTF-8?q?=ED=95=84=EC=88=98=20directory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\355\225\204\354\210\230/1213_h.cpp" | 65 --------------- .../\355\225\204\354\210\230/17451_h.cpp" | 65 --------------- .../\355\225\204\354\210\230/18111_h.cpp" | 81 ------------------- 3 files changed, 211 deletions(-) delete mode 100644 "06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" delete mode 100644 "06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" delete mode 100644 "06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" diff --git "a/06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" "b/06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" deleted file mode 100644 index 2797109..0000000 --- "a/06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include - - -using namespace std; - -// 주어진 문자열이 팰린드롬이 될 수 있는지 문자열의 알파벳과 그 개수를 저장한 맵을 통해 체크하는 함수 -bool checkPalindrome(char& odd_alp, const map& alp_cnt) { - int odd_cnt = 0; - for (auto iter : alp_cnt) { - if (iter.second % 2 == 1) { // 개수가 홀수인 알파벳이 있을 때 - odd_alp = iter.first; // 그 알파벳을 저장 - odd_cnt++; // 홀수 카운트 증가 - if (odd_cnt == 2) { // 홀수인 알파벳이 1개 초과 -> 팰린드롬 불가. - return false; - } - } - } - return true; -} - -// 주어진 문자열을 팰린드롬으로 만드는 함수 -string makePalindrome(int name_len, char odd_alp, map alp_cnt) { - string answer = ""; - - for (auto iter : alp_cnt) { - // 사전 순으로 정렬된 알파벳을 등장 횟수의 절반만 빈 문자열에 추가. - for (int i = 0; i < iter.second / 2; i++) { - answer += iter.first; - } - } - - if (odd_alp != 'a') { // 홀수 갯수의 알파벳이 존재할 때 - answer += odd_alp; // 가운데에 추가 - } - for (int i = name_len / 2 - 1; i >= 0; i--) { - answer += answer[i]; // 문자열을 뒤집어서 뒤에 추가. - } - return answer; -} - -int main() { - int name_len; // 주어진 문자열의 길이 - char odd_alp = 'a'; // 등장 횟수가 홀수인 알파벳 - string name; // 주어진 문자열 - map alp_cnt; // 문자열 내 알파벳과 각각의 개수를 저장하는 맵 - - // 입력 - cin >> name; - name_len = name.length(); - - for (int i = 0; i < name_len; i++) { - alp_cnt[name[i]]++; // 알파벳의 개수를 저장하는 맵을 생성. - } - - // 팰린드롬이 될 수 있는지 확인 - if (!checkPalindrome(odd_alp, alp_cnt)) { - cout << "I'm Sorry Hansoo"; - return 0; - } - - // 가능할 경우 팰린드롬 출력 - cout << makePalindrome(name_len, odd_alp, alp_cnt); -} diff --git "a/06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" "b/06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" deleted file mode 100644 index 0900424..0000000 --- "a/06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include - -using namespace std; - -// 주어진 문자열이 팰린드롬이 될 수 있는지 문자열의 알파벳과 그 개수를 저장한 맵을 통해 체크하는 함수 -bool checkPalindrome(char& odd_alp, const map& alp_cnt) { - int odd_cnt = 0; - for (auto iter : alp_cnt) { - if (iter.second % 2 == 1) { // 개수가 홀수인 알파벳이 있을 때 - odd_alp = iter.first; // 그 알파벳을 저장 - odd_cnt++; // 홀수 카운트 증가 - if (odd_cnt == 2) { // 홀수인 알파벳이 1개 초과 -> 팰린드롬 불가. - return false; - } - } - } - return true; -} - -// 주어진 문자열을 팰린드롬으로 만드는 함수 -string makePalindrome(int name_len, char odd_alp, map alp_cnt) { - string answer = ""; - - for (auto iter : alp_cnt) { - // 사전 순으로 정렬된 알파벳을 등장 횟수의 절반만 빈 문자열에 추가. - for (int i = 0; i < iter.second / 2; i++) { - answer += iter.first; - } - } - - if (odd_alp != 'a') { // 홀수 갯수의 알파벳이 존재할 때 - answer += odd_alp; // 가운데에 추가 - } - for (int i = name_len / 2 - 1; i >= 0; i--) { - answer += answer[i]; // 문자열을 뒤집어서 뒤에 추가. - } - return answer; -} - -int main() { - int name_len; // 주어진 문자열의 길이 - char odd_alp = 'a'; // 등장 횟수가 홀수인 알파벳 - string name; // 주어진 문자열 - map alp_cnt; // 문자열 내 알파벳과 각각의 개수를 저장하는 맵 - - - // 입력 - cin >> name; - name_len = name.length(); - - for (int i = 0; i < name_len; i++) { - alp_cnt[name[i]]++; // 알파벳의 개수를 저장하는 맵을 생성. - } - - // 팰린드롬이 될 수 있는지 확인 - if (!checkPalindrome(odd_alp, alp_cnt)) { - cout << "I'm Sorry Hansoo"; - return 0; - } - - // 가능할 경우 팰린드롬 출력 - cout << makePalindrome(name_len, odd_alp, alp_cnt); -} diff --git "a/06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" "b/06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" deleted file mode 100644 index 66987d8..0000000 --- "a/06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include - -using namespace std; - -typedef pair pii; - -const int MAX_HEIGHT = 257; // 블록 높이의 최댓값 -const int INF = 987'654'321; // 무한대를 나타내는 값, 최댓값이 12,800,000이므로 큰 수인 987654321을 사용 - -// 모든 땅의 높이를 height로 만드는 비용 계산 함수 -int calcCost(int height, int n, int m, int b, vector>& blocks) { - int cost = 0; - int added = 0; // 추가해야 하는 블록의 총 개수 - int removed = 0; // 제거해야 하는 블록의 총 개수 - - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - int gap = abs(height - blocks[i][j]); - - if (blocks[i][j] > height) { - // 목표 높이보다 높은 칸인 경우, gap개의 블록 제거 - removed += gap; - } else if (blocks[i][j] < height) { - // 목표 높이보다 낮은 칸인 경우, gap개의 블록 추가 - added += gap; - } - } - } - - // 전체 비용 계산 - cost = 2 * removed + added; - - // 블록 개수가 부족하다면 모든 땅의 높이를 height로 만드는 것이 불가능 - return (added > (b + removed)) ? INF : cost; -} - -// 모든 땅의 높이를 같게 만드는 최소 비용과 그 때의 땅의 높이를 반환하는 함수 -pii makeGroundEven(int n, int m, int b, vector>& ground) { - int minCost = INF; - int height = 0; - - // 모든 높이를 다 만들어보고 최소 비용 찾기 - for (int i = 0; i < MAX_HEIGHT; i++) { - int cost = calcCost(i, n, m, b, ground); - if (cost <= minCost) { - minCost = cost; - height = i; - } - } - - return {minCost, height}; -} - -/** - * 블록 높이의 최댓값이 256밖에 되지 않으므로 - * 모든 칸을 높이 n(0~256)으로 만드는 모든 경우를 시도해보고 - * 그 중에서 비용이 최소가 될 때를 찾는다. - */ - - -int main() { - int n, m, b; - - // 입력 - cin >> n >> m >> b; - vector> ground(n, vector(m)); - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - cin >> ground[i][j]; - } - } - - // 연산 - pii answer = makeGroundEven(n, m, b, ground); - - // 출력 - cout << answer.first << " " << answer.second << "\n"; - - return 0; -} From 20c844db7f3a5eb0d1cc92739d0852e1fa336dad Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:12:16 +0900 Subject: [PATCH 08/15] =?UTF-8?q?Delete=2009=5Fbacktracking/=ED=95=84?= =?UTF-8?q?=EC=88=98=20directory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\355\225\204\354\210\230/14888.cpp" | 68 -------------- .../\355\225\204\354\210\230/15665.cpp" | 59 ------------ .../\355\225\204\354\210\230/20055.cpp" | 91 ------------------- 3 files changed, 218 deletions(-) delete mode 100644 "09_backtracking/\355\225\204\354\210\230/14888.cpp" delete mode 100644 "09_backtracking/\355\225\204\354\210\230/15665.cpp" delete mode 100644 "09_backtracking/\355\225\204\354\210\230/20055.cpp" diff --git "a/09_backtracking/\355\225\204\354\210\230/14888.cpp" "b/09_backtracking/\355\225\204\354\210\230/14888.cpp" deleted file mode 100644 index 7a2e512..0000000 --- "a/09_backtracking/\355\225\204\354\210\230/14888.cpp" +++ /dev/null @@ -1,68 +0,0 @@ -#include - -using namespace std; - -const int MAX_N = 11; - -int n; - -int min_num = 1000000001; -int max_num = -1000000001; - -int sequence[MAX_N]; // 수열 -int operators[4]; // 연산자 - -void updateAnswer(int ans) { - max_num = max(max_num, ans); - min_num = min(min_num, ans); -} - -void findMinMax(int ans, int cnt) -{ - //재귀 호출 종료 조건 : 수열의 값을 다 사용하였을 경우 - if(cnt == n) - { - updateAnswer(ans); - return; - } - - //i : 연산자 종류 - for(int i = 0; i < 4; i++) - { - // 연산자를 다 쓰지 않은 경우만 - if(operators[i] > 0) - { - //연산자 사용 - operators[i]--; - - //rst 값 업데이트 및 다음 연산자 고르기 - if(i == 0) - findMinMax(ans + sequence[cnt], cnt + 1); - else if(i == 1) - findMinMax(ans - sequence[cnt], cnt + 1); - else if(i == 2) - findMinMax(ans * sequence[cnt], cnt + 1); - else - findMinMax(ans / sequence[cnt], cnt + 1); - - operators[i]++; // 연산자 반납 - } - } - return; -} - -int main() { - - //입력 - cin >> n; - for(int i = 0; i < n; i++) - cin >> sequence[i]; - for(int i = 0; i < 4; i++) - cin >> operators[i]; - - //연산 - findMinMax(sequence[0], 1); - - //출력 - cout << max_num << '\n' << min_num; -} \ No newline at end of file diff --git "a/09_backtracking/\355\225\204\354\210\230/15665.cpp" "b/09_backtracking/\355\225\204\354\210\230/15665.cpp" deleted file mode 100644 index c3ad893..0000000 --- "a/09_backtracking/\355\225\204\354\210\230/15665.cpp" +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include -#include - -using namespace std; - -const int MAX_N = 8; - -int n, m; -int sequence[MAX_N]; -vector ans; - -void printSequence() { - for (int i = 0; i < m; i++) { - cout << ans[i] << " "; - } - cout << "\n"; -} - -void backtrack(int cnt, int start) -{ - // 재귀 호출 종료 조건 : M개의 숫자를 다 뽑은 경우 - if (cnt == m) - { - printSequence(); - return; - } - - //i : 고르려는 수 - int prev_num = -1; // 이전에 선택한 숫자를 기억하기 위한 변수 - for (int i = 0; i < n; i++) - { - // 중복 선택 허용, 중복된 숫자를 생성하지 않도록 조건 추가 - if (sequence[i] != prev_num) { - //사용 - ans.push_back(sequence[i]); - prev_num = sequence[i]; - - //다음 숫자 고르기 - backtrack(cnt + 1, i + 1); - - //반납 - ans.pop_back(); - } - } -} - -int main() -{ - //입력력 - cin >> n >> m; - for (int i = 0; i < n; i++) - cin >> sequence[i]; - - //연산 및 출력 - sort(sequence, sequence + n); // 입력된 숫자 배열을 정렬 - - backtrack(0, 0); // 조합 생성 시작 -} diff --git "a/09_backtracking/\355\225\204\354\210\230/20055.cpp" "b/09_backtracking/\355\225\204\354\210\230/20055.cpp" deleted file mode 100644 index 3448263..0000000 --- "a/09_backtracking/\355\225\204\354\210\230/20055.cpp" +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include - -using namespace std; - -struct info { // 내구도와 로봇 존재 여부를 나타내는 구조체 - int power; // 컨베이어 벨트의 칸 내구도 - bool is_on; // 해당 칸에 로봇이 존재하는지 여부 -}; - -// 컨베이어 벨트 한 칸 회전 함수 -void rotateBelt(deque &belt, int n) { - belt.push_front(belt.back()); // 맨 뒤의 칸을 앞으로 이동 - belt.pop_back(); // 맨 뒤의 칸 제거 - belt[n - 1].is_on = false; // 로봇이 내리는 위치에서 로봇 제거 -} - -// 로봇을 이동시킬 수 있는 경우 이동하는 함수 -void moveRobot(deque &belt, int n) { - for (int i = n - 2; i >= 0; i--) { - if (!belt[i].is_on) { - continue; // 해당 칸에 로봇이 없으면 다음 칸으로 이동 - } - - if (!belt[i + 1].is_on && (belt[i + 1].power >= 1)) { - // 다음 칸이 비어있고 내구도가 남아있을 때 로봇 이동 - belt[i].is_on = false; - belt[i + 1].is_on = true; - belt[i + 1].power--; - } - - belt[n - 1].is_on = false; // 로봇이 내리는 위치에서 로봇 제거 - } -} - -// 로봇을 컨베이어 벨트에 올릴 수 있는 경우 로봇을 올리는 함수 -void putRobot(deque &belt) { - if (!belt[0].is_on && belt[0].power >= 1) { - // 로봇이 없고 내구도가 남아있는 경우 로봇을 올림 - belt[0].is_on = true; - belt[0].power--; - } -} - -// 컨베이어 벨트의 내구도를 확인하여 작업 종료 여부를 반환 -bool checkFinish(deque &belt, int n, int k) { - int count = 0; - - for (int i = 0; i < 2 * n; i++) { - if (belt[i].power == 0) { - count++; - } - } - - return count >= k; -} - -int solution(deque &belt, int n, int k) { - int step = 1; - while (true) { - // 컨베이어 벨트 회전 - rotateBelt(belt, n); - // 로봇 이동 - moveRobot(belt, n); - // 로봇 올리기 - putRobot(belt); - - // 내구도 체크 - if (checkFinish(belt, n, k)) { - return step; - } - step++; - } -} - -int main() { - // 입력 - int n, k; - cin >> n >> k; - deque belt(2 * n); // 컨베이어 벨트의 내구도와 로봇 존재 여부 저장 - for (int i = 0; i < 2 * n; i++) { - cin >> belt[i].power; - belt[i].is_on = false; - } - - // 연산 - int answer = solution(belt, n, k); - - // 출력 - cout << answer; -} \ No newline at end of file From b0edf416c7c08d724ae9c40411dbaa6cf0d089bd Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:12:22 +0900 Subject: [PATCH 09/15] Delete 10_binary_search directory --- .../\353\217\204\354\240\204/2343.cpp" | 61 ---------------- .../\353\217\204\354\240\204/3079.cpp" | 53 -------------- .../\355\225\204\354\210\230/10815.cpp" | 55 -------------- .../\355\225\204\354\210\230/14500.cpp" | 73 ------------------- .../\355\225\204\354\210\230/16401.cpp" | 49 ------------- 5 files changed, 291 deletions(-) delete mode 100644 "10_binary_search/\353\217\204\354\240\204/2343.cpp" delete mode 100644 "10_binary_search/\353\217\204\354\240\204/3079.cpp" delete mode 100644 "10_binary_search/\355\225\204\354\210\230/10815.cpp" delete mode 100644 "10_binary_search/\355\225\204\354\210\230/14500.cpp" delete mode 100644 "10_binary_search/\355\225\204\354\210\230/16401.cpp" diff --git "a/10_binary_search/\353\217\204\354\240\204/2343.cpp" "b/10_binary_search/\353\217\204\354\240\204/2343.cpp" deleted file mode 100644 index f00a4c9..0000000 --- "a/10_binary_search/\353\217\204\354\240\204/2343.cpp" +++ /dev/null @@ -1,61 +0,0 @@ -#include -#include -#include -#include - -using namespace std; - -bool isPossible(vector& lessons, int m, int mid) { - int count = 1; - int sum = 0; - - for (int i = 0; i < lessons.size(); i++) { - if (sum + lessons[i] > mid) { - count++; - sum = lessons[i]; - } else { - sum += lessons[i]; - } - } - - return count <= m; -} - -int binarySearch(vector& lessons, int m) { - int left = *max_element(lessons.begin(), lessons.end()); - int right = accumulate(lessons.begin(), lessons.end(), 0); - int result = 0; - - while (left <= right) { - int mid = (left + right) / 2; - if (isPossible(lessons, m, mid)) { - result = mid; - right = mid - 1; - } else { - left = mid + 1; - } - } - - return result; -} - -int main() { - ios_base::sync_with_stdio(false); - cin.tie(NULL); - cout.tie(NULL); - - // 입력 - int n, m; - cin >> n >> m; - - vector lessons(n); - - for (int i = 0; i < n; i++) { - cin >> lessons[i]; - } - - // 연산 & 출력 - cout << binarySearch(lessons, m); - - return 0; -} diff --git "a/10_binary_search/\353\217\204\354\240\204/3079.cpp" "b/10_binary_search/\353\217\204\354\240\204/3079.cpp" deleted file mode 100644 index 6e318ad..0000000 --- "a/10_binary_search/\353\217\204\354\240\204/3079.cpp" +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include -#include - -using namespace std; - -typedef long long ll; - -ll binarySearch(const vector& times, int n, int m) { - ll start = 1, end = static_cast(*max_element(times.begin(), times.end())) * m; - ll answer = 0; - - while (start <= end) { - ll mid = (start + end) / 2; - ll cnt = 0; - - for (int i = 0; i < n; i++) { - cnt += mid / times[i]; - if (cnt >= m) { - break; - } - } - - if (cnt >= m) { - answer = mid; - end = mid - 1; - } else { - start = mid + 1; - } - } - - return answer; -} - -int main() { - ios_base::sync_with_stdio(false); - cin.tie(NULL); - cout.tie(NULL); - - int n, m; - cin >> n >> m; - vector times(n); - - for (int i = 0; i < n; i++) { - cin >> times[i]; - } - - sort(times.begin(), times.end()); - - cout << binarySearch(times, n, m); - - return 0; -} diff --git "a/10_binary_search/\355\225\204\354\210\230/10815.cpp" "b/10_binary_search/\355\225\204\354\210\230/10815.cpp" deleted file mode 100644 index 8407cdb..0000000 --- "a/10_binary_search/\355\225\204\354\210\230/10815.cpp" +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include - -using namespace std; - -int binarySearch(int n, int key, vector &nums) { - int left = 0; - int right = n - 1; - int mid; - - while(left <= right) { - mid = (left + right) / 2; - if (nums[mid] == key) { - return 1; - } - else if (nums[mid] > key) { - right = mid - 1; - } - else { - left = mid + 1; - } - } - return 0; -} - - -int main() { - ios_base::sync_with_stdio(false); - cin.tie(NULL); - cout.tie(NULL); - - int n, m, input; - - //입력 - cin >> n; - vector arr(n, 0); - - for (int i = 0; i < n; i++) { - cin >> arr[i]; - } - - cin >> m; - - //이분 탐색을 하기 위해 정렬 - sort(arr.begin(), arr.end()); - - //연산 & 출력 - while(m--) { - cin >> input; - cout << binarySearch(n, input, arr) << ' '; - } - - return 0; -} \ No newline at end of file diff --git "a/10_binary_search/\355\225\204\354\210\230/14500.cpp" "b/10_binary_search/\355\225\204\354\210\230/14500.cpp" deleted file mode 100644 index 974db0d..0000000 --- "a/10_binary_search/\355\225\204\354\210\230/14500.cpp" +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include - -using namespace std; - -vector> board; // 게임 보드를 나타내는 2D 벡터 -int ans; // 최대 결과를 저장할 변수 - -// 깊이 우선 탐색(Depth-First Search) 함수로 다양한 테트로미노 모양을 탐색 -void dfs(int x, int y, int depth, int sum) { - // 네 가지 방향으로 이동하기 위한 배열: 위, 오른쪽, 아래, 왼쪽 - vector dx = { -1, 0, 1, 0 }; - vector dy = { 0, 1, 0, -1 }; - - if (depth == 4) { // 네 개의 칸을 선택했을 경우, 최대 결과를 갱신 - ans = max(ans, sum); - return; - } - - for (int i = 0; i < 4; i++) { - // 다음에 선택할 칸의 좌표를 계산 - int nx = x + dx[i]; - int ny = y + dy[i]; - - if (nx < 0 || nx >= board.size() || ny < 0 || ny >= board[0].size() || !board[nx][ny]) { - // 셀이 범위를 벗어나거나 이미 방문한 경우 CONTINUE - continue; - } - - int temp = board[nx][ny]; // 방문하기 전 현재 셀의 값을 저장 - board[nx][ny] = 0; // 재방문을 피하기 위해 현재 셀을 방문 처리 - - if (depth == 2) { - // "ㅜ" 모양의 특수한 경우로, 현재 셀에서 다시 블록을 선택 - dfs(x, y, depth + 1, sum + temp); - } - - // 깊이와 합을 업데이트하여 다음 셀로 이동 - dfs(nx, ny, depth + 1, sum + temp); - - board[nx][ny] = temp; // 원래 값 복원 - } -} - -int main() { - //입력 - int n, m; - cin >> n >> m; - board.assign(n, vector(m, 0)); // 게임 보드의 크기를 n x m으로 초기화 - - // 게임 보드의 값 입력 - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - cin >> board[i][j]; - } - } - - // 각 셀에서 시작하여 테트로미노 모양을 찾기 위한 탐색을 수행 - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - int temp = board[i][j]; - board[i][j] = 0; // 시작 셀을 방문 처리 - dfs(i, j, 1, temp); // 깊이 1과 초기 합으로 DFS를 시작 - board[i][j] = temp; // 원래 값을 복원 - } - } - - // 출력 - cout << ans; - - return 0; -} diff --git "a/10_binary_search/\355\225\204\354\210\230/16401.cpp" "b/10_binary_search/\355\225\204\354\210\230/16401.cpp" deleted file mode 100644 index bb4d070..0000000 --- "a/10_binary_search/\355\225\204\354\210\230/16401.cpp" +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include - -using namespace std; - -bool isPossible(vector& lengths, int target, int m) { - int count = 0; - for (int i = 0; i < lengths.size(); i++) { - count += lengths[i] / target; - } - return count >= m; -} - -int binarySearch(vector& lengths, int m) { - int left = 1; - int right = lengths[lengths.size() - 1]; - int result = 0; - - while (left <= right) { - int mid = (left + right) / 2; - if (isPossible(lengths, mid, m)) { - result = mid; - left = mid + 1; - } else { - right = mid - 1; - } - } - - return result; -} - -int main () { - int m, n; - - //입력 - cin >> m >> n; - - vector arr(n, 0); - - for (int i = 0; i < n; i++) { - cin >> arr[i]; - } - - //연산 & 출력 - cout << binarySearch(arr, m); - - return 0; -} From 7cce97fc9989f9a2c714e9aa843fc0606058a3c1 Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 22 Nov 2023 16:08:54 +0900 Subject: [PATCH 10/15] =?UTF-8?q?231122=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 12_tree/3190.cpp | 83 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 12_tree/3190.cpp diff --git a/12_tree/3190.cpp b/12_tree/3190.cpp new file mode 100644 index 0000000..8542567 --- /dev/null +++ b/12_tree/3190.cpp @@ -0,0 +1,83 @@ +//백준에서 자꾸 11%에서 틀려서 주석도 달아보고 문제를 해결하려고 했는데 모르겠습니다ㅠㅠ + +#include +#include +#include + +using namespace std; + +// 뱀의 좌표 구조체 +struct Point { + int x, y; +}; + +int main() { + //입력 + int N, K, L; + cin >> N >> K; + + vector> board(N + 1, vector(N + 1, 0)); + for (int i = 0; i < K; ++i) { + int x, y; + cin >> x >> y; + board[x][y] = 1; // 사과의 위치를 1로 표시 + } + + cin >> L; + queue> moves; + for (int i = 0; i < L; ++i) { + int X; + char C; + cin >> X >> C; + moves.push(make_pair(X, C)); + } + + vector snake; // 뱀의 위치 저장 + snake.push_back({1, 1}); // 뱀의 초기 위치 (1, 1) + board[1][1] = -1; // 뱀의 위치를 -1로 표시 + + int dx[4] = {0, 1, 0, -1}; // 상, 우, 하, 좌 + int dy[4] = {-1, 0, 1, 0}; + int direction = 1; // 초기 방향: 오른쪽 + + int time = 0; + int idx = 0; + + while (true) { + time++; + + int nx = snake.front().x + dx[direction]; + int ny = snake.front().y + dy[direction]; + + // 벽에 부딪히거나 자기 몸에 닿으면 종료 + if (nx < 1 || nx > N || ny < 1 || ny > N || board[nx][ny] == -1) { + cout << time << '\n'; + break; + } + + snake.insert(snake.begin(), {nx, ny}); + + // 사과를 먹지 않으면 꼬리 제거 + if (board[nx][ny] != 1) { + board[snake.back().x][snake.back().y] = 0; + snake.pop_back(); + } else { + board[nx][ny] = -1; // 사과를 먹으면 뱀의 몸통으로 표시 + } + + // 방향 전환 + if (!moves.empty() && time == moves.front().first) { + if (moves.front().second == 'L') { + direction = (direction + 3) % 4; // 왼쪽으로 회전 + } else { + direction = (direction + 1) % 4; // 오른쪽으로 회전 + } + moves.pop(); + } + + // 뱀의 머리 위치 업데이트 + board[snake.front().x][snake.front().y] = -1; + } + + return 0; +} From 2c3e9434900fea02f7becc6049dae673148f711c Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 22 Nov 2023 16:16:03 +0900 Subject: [PATCH 11/15] =?UTF-8?q?231122=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 12_tree/5639.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 12_tree/5639.cpp diff --git a/12_tree/5639.cpp b/12_tree/5639.cpp new file mode 100644 index 0000000..166d8ef --- /dev/null +++ b/12_tree/5639.cpp @@ -0,0 +1,61 @@ +#include +#include + +using namespace std; + +// 이진 트리 노드 구조체 +struct Node { + int data; + Node* left; + Node* right; +}; + +// 이진 트리 노드 생성 함수 +Node* createNode(int data) { + Node* newNode = new Node(); + newNode->data = data; + newNode->left = newNode->right = nullptr; + return newNode; +} + +// 이진 트리 삽입 함수 +Node* insertNode(Node* root, int data) { + if (root == nullptr) { + return createNode(data); + } + + if (data < root->data) { + root->left = insertNode(root->left, data); + } else { + root->right = insertNode(root->right, data); + } + + return root; +} + +// 이진 트리 후위 순회 함수 +void postorder(Node* root) { + if (root == nullptr) { + return; + } + + postorder(root->left); + postorder(root->right); + cout << root->data << '\n'; +} + +int main() { + int value; + Node* root = nullptr; + + //입력 & 연산 + // 전위 순회 결과로 이진 트리 생성 + while (cin >> value) { + root = insertNode(root, value); + } + + //출력 + postorder(root); + + return 0; +} From e5bdb0cc35a55a9e88f30a8d66a08a2489271034 Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 22 Nov 2023 17:54:44 +0900 Subject: [PATCH 12/15] Delete 11-two-pointer directory --- .../\353\217\204\354\240\204/20437.cpp" | 60 ---------------- .../\353\217\204\354\240\204/2473.cpp" | 64 ----------------- .../\355\225\204\354\210\230/14503.cpp" | 71 ------------------- .../\355\225\204\354\210\230/20922.cpp" | 44 ------------ .../\355\225\204\354\210\230/2531.cpp" | 56 --------------- 5 files changed, 295 deletions(-) delete mode 100644 "11-two-pointer/\353\217\204\354\240\204/20437.cpp" delete mode 100644 "11-two-pointer/\353\217\204\354\240\204/2473.cpp" delete mode 100644 "11-two-pointer/\355\225\204\354\210\230/14503.cpp" delete mode 100644 "11-two-pointer/\355\225\204\354\210\230/20922.cpp" delete mode 100644 "11-two-pointer/\355\225\204\354\210\230/2531.cpp" diff --git "a/11-two-pointer/\353\217\204\354\240\204/20437.cpp" "b/11-two-pointer/\353\217\204\354\240\204/20437.cpp" deleted file mode 100644 index af5b02a..0000000 --- "a/11-two-pointer/\353\217\204\354\240\204/20437.cpp" +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#include - -using namespace std; - -void findSolution(const string& word, int K) { - vector positions[26]; - int min_length = INT_MAX; - int max_length = -1; - - for (int i = 0; i < word.length(); i++) - positions[word[i] - 'a'].push_back(i); - - for (int i = 0; i < 26; i++) { - if (positions[i].size() >= K) { - int left = 0; - int right = K - 1; - - int temp_min_length = positions[i][right] - positions[i][left] + 1; - int temp_max_length = positions[i][right] - positions[i][left] + 1; - - while (right < positions[i].size() - 1) { - right++; - left++; - temp_min_length = min(positions[i][right] - positions[i][left] + 1, temp_min_length); - temp_max_length = max(positions[i][right] - positions[i][left] + 1, temp_max_length); - } - - min_length = min(temp_min_length, min_length); - max_length = max(temp_max_length, max_length); - } - } - - if (min_length == INT_MAX) - cout << -1 << "\n"; - else - cout << min_length << " " << max_length << "\n"; -} - -int main() { - ios_base::sync_with_stdio(false); - cin.tie(NULL); - cout.tie(NULL); - - //입력 - int T; - cin >> T; - - while (T--) { - string word; - int K; - cin >> word >> K; - - // 연산 & 출력 - findSolution(word, K); - } - - return 0; -} diff --git "a/11-two-pointer/\353\217\204\354\240\204/2473.cpp" "b/11-two-pointer/\353\217\204\354\240\204/2473.cpp" deleted file mode 100644 index 1e3e8e2..0000000 --- "a/11-two-pointer/\353\217\204\354\240\204/2473.cpp" +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include -#include - -using namespace std; -typedef long long ll; -const ll INF = 2e18 + 1; - -/** - * 세 용액의 합이 가장 0에 가까운 용액의 쌍 리턴 - */ - -vector findLiquid(vector& arr) { - int n = arr.size(); - vector result(3, 0); - ll closestSum = INF; - - for (int i = 0; i < n - 2; ++i) { - int left = i + 1; - int right = n - 1; - - while (left < right) { - ll currentSum = arr[i] + arr[left] + arr[right]; - - if (llabs(currentSum) < closestSum) { - closestSum = llabs(currentSum); - result[0] = arr[i]; - result[1] = arr[left]; - result[2] = arr[right]; - } - - if (currentSum < 0) { - left++; - } else { - right--; - } - } - } - - return result; -} - -int main() { - - //입력 - int n; - cin >> n; - - vector arr(n); - for (int i = 0; i < n; ++i) { - cin >> arr[i]; - } - - //연산 - sort(arr.begin(), arr.end()); - vector result = findLiquid(arr); - - //출력 - for (int i = 0; i < 3; ++i) { - cout << result[i] << ' '; - } - - return 0; -} diff --git "a/11-two-pointer/\355\225\204\354\210\230/14503.cpp" "b/11-two-pointer/\355\225\204\354\210\230/14503.cpp" deleted file mode 100644 index d0ffacd..0000000 --- "a/11-two-pointer/\355\225\204\354\210\230/14503.cpp" +++ /dev/null @@ -1,71 +0,0 @@ -#include -#include - -using namespace std; - -// 북, 동, 남, 서 방향을 나타내는 상수 -const int dx[] = {-1, 0, 1, 0}; -const int dy[] = {0, 1, 0, -1}; - -// 청소 상태를 나타내는 상수 -const int CLEAN = 0; -const int WALL = 1; -const int CLEANED = 2; - -int n, m; // 지도의 크기 -vector> map; // 지도 -int answer = 0; // 청소한 영역의 개수 - -void clean(int x, int y, int direction) { - // 현재 위치 청소 - if (map[x][y] == CLEAN) { - map[x][y] = CLEANED; - answer++; - } - - // 네 방향 탐색 - for (int i = 0; i < 4; ++i) { - int nextDirection = (direction + 3 - i) % 4; // 현재 방향에서 왼쪽으로 회전 - int nx = x + dx[nextDirection]; - int ny = y + dy[nextDirection]; - - // 왼쪽 방향에 아직 청소하지 않은 공간이 있다면 전진 - if (map[nx][ny] == CLEAN) { - clean(nx, ny, nextDirection); - return; - } - } - - // 네 방향 모두 청소가 이미 되어있거나 벽인 경우 후진 - int backwardDirection = (direction + 2) % 4; - int nx = x + dx[backwardDirection]; - int ny = y + dy[backwardDirection]; - - // 후진할 수 있으면 후진 - if (map[nx][ny] != WALL) { - clean(nx, ny, direction); - } -} - -int main() { - // 입력 - cin >> n >> m; - map.resize(n, vector(m)); - - int startX, startY, startDirection; - cin >> startX >> startY >> startDirection; - - for (int i = 0; i < n; ++i) { - for (int j = 0; j < m; ++j) { - cin >> map[i][j]; - } - } - - // 연산 - clean(startX, startY, startDirection); - - // 출력 - cout << answer << '\n'; - - return 0; -} diff --git "a/11-two-pointer/\355\225\204\354\210\230/20922.cpp" "b/11-two-pointer/\355\225\204\354\210\230/20922.cpp" deleted file mode 100644 index 19faa05..0000000 --- "a/11-two-pointer/\355\225\204\354\210\230/20922.cpp" +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include - -using namespace std; - -int findSolution(const vector& arr, int k) { - int n = arr.size(); - vector frequency(100001, 0); - - int left = 0, right = 0; - int maxLength = 0; - - while (right < n) { - frequency[arr[right]]++; - - // 현재 구간의 서로 다른 숫자의 개수가 k 초과라면 - while (frequency[arr[right]] > k) { - frequency[arr[left]]--; - left++; - } - - // 현재 구간의 길이가 최대인지 확인하고 right 증가 - maxLength = max(maxLength, right - left + 1); - right++; - } - - return maxLength; -} - -int main() { - //입력 - int n, k; - cin >> n >> k; - - vector arr(n); - for (int i = 0; i < n; ++i) { - cin >> arr[i]; - } - - //연산 & 출력 - cout << findSolution(arr, k) << '\n'; - - return 0; -} diff --git "a/11-two-pointer/\355\225\204\354\210\230/2531.cpp" "b/11-two-pointer/\355\225\204\354\210\230/2531.cpp" deleted file mode 100644 index ab1ebf2..0000000 --- "a/11-two-pointer/\355\225\204\354\210\230/2531.cpp" +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include - -using namespace std; - -void findSolution(int n, int d, int k, int c, vector& sushi) { - vector check(d + 1, 0); - int crt_ans = 1; - int ans = 0; - - check[c] = 1; - - for (int i = 0; i < k; i++) { - if (check[sushi[i]] == 0) { - crt_ans++; - } - check[sushi[i]]++; - sushi[n + i] = sushi[i]; - } - - for (int i = 0; i < n; i++) { - ans = max(crt_ans, ans); - - check[sushi[i]]--; - - if (check[sushi[i]] == 0) { - crt_ans--; - } - - if (check[sushi[i + k]] == 0) { - crt_ans++; - } - check[sushi[i + k]]++; - } - - cout << ans; -} - -int main() { - ios_base::sync_with_stdio(0); - cin.tie(0); - - // 입력 - int n, d, k, c; - cin >> n >> d >> k >> c; - - vector sushi(n + k); - for (int i = 0; i < n; i++) { - cin >> sushi[i]; - } - - // 연산 & 출력 - findSolution(n, d, k, c, sushi); - - return 0; -} From 38fb05935dc8471965b10503fa18372d0495ad8a Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 22 Nov 2023 18:50:22 +0900 Subject: [PATCH 13/15] =?UTF-8?q?231122=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 12_tree/15681.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 12_tree/15681.cpp diff --git a/12_tree/15681.cpp b/12_tree/15681.cpp new file mode 100644 index 0000000..caa18e5 --- /dev/null +++ b/12_tree/15681.cpp @@ -0,0 +1,56 @@ +#include +#include + +using namespace std; + +vector> adj_list; // 인접 리스트 +vector subtree_size; // 각 정점의 서브트리 크기 +vector visited; // 방문 여부 표시 + +// DFS를 통해 각 정점을 루트로 하는 서브트리의 크기를 계산 +int calculateSubtreeSizes(int node) { + visited[node] = true; + subtree_size[node] = 1; // 해당 정점 자신을 포함 + + for (int i = 0; i < adj_list[node].size(); ++i) { + int child = adj_list[node][i]; + if (!visited[child]) { // 아직 방문하지 않은 자식 노드라면 + subtree_size[node] += calculateSubtreeSizes(child); + } + } + + return subtree_size[node]; +} + +int main() { + ios_base::sync_with_stdio(false); // 입출력 최적화 + cin.tie(NULL), cout.tie(NULL); + + //입력 + int num_vertices, root, num_queries; + cin >> num_vertices >> root >> num_queries; + + + adj_list.resize(num_vertices + 1); + subtree_size.resize(num_vertices + 1); + visited.resize(num_vertices + 1, false); + + for (int i = 0; i < num_vertices - 1; ++i) { + int U, V; + cin >> U >> V; + adj_list[U].push_back(V); + adj_list[V].push_back(U); + } + + //연산 + calculateSubtreeSizes(root); + + //출력 + for (int i = 0; i < num_queries; ++i) { + int query_vertex; + cin >> query_vertex; + cout << subtree_size[query_vertex] << '\n'; + } + + return 0; +} From 39e04c19ae8ca12280ee6ac3e3239502e3d7386e Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 22 Nov 2023 18:52:00 +0900 Subject: [PATCH 14/15] =?UTF-8?q?231122=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 12_tree/3190.cpp | 84 +----------------------------------------------- 1 file changed, 1 insertion(+), 83 deletions(-) diff --git a/12_tree/3190.cpp b/12_tree/3190.cpp index 8542567..05d9def 100644 --- a/12_tree/3190.cpp +++ b/12_tree/3190.cpp @@ -1,83 +1 @@ -//백준에서 자꾸 11%에서 틀려서 주석도 달아보고 문제를 해결하려고 했는데 모르겠습니다ㅠㅠ - -#include -#include -#include - -using namespace std; - -// 뱀의 좌표 구조체 -struct Point { - int x, y; -}; - -int main() { - //입력 - int N, K, L; - cin >> N >> K; - - vector> board(N + 1, vector(N + 1, 0)); - for (int i = 0; i < K; ++i) { - int x, y; - cin >> x >> y; - board[x][y] = 1; // 사과의 위치를 1로 표시 - } - - cin >> L; - queue> moves; - for (int i = 0; i < L; ++i) { - int X; - char C; - cin >> X >> C; - moves.push(make_pair(X, C)); - } - - vector snake; // 뱀의 위치 저장 - snake.push_back({1, 1}); // 뱀의 초기 위치 (1, 1) - board[1][1] = -1; // 뱀의 위치를 -1로 표시 - - int dx[4] = {0, 1, 0, -1}; // 상, 우, 하, 좌 - int dy[4] = {-1, 0, 1, 0}; - int direction = 1; // 초기 방향: 오른쪽 - - int time = 0; - int idx = 0; - - while (true) { - time++; - - int nx = snake.front().x + dx[direction]; - int ny = snake.front().y + dy[direction]; - - // 벽에 부딪히거나 자기 몸에 닿으면 종료 - if (nx < 1 || nx > N || ny < 1 || ny > N || board[nx][ny] == -1) { - cout << time << '\n'; - break; - } - - snake.insert(snake.begin(), {nx, ny}); - - // 사과를 먹지 않으면 꼬리 제거 - if (board[nx][ny] != 1) { - board[snake.back().x][snake.back().y] = 0; - snake.pop_back(); - } else { - board[nx][ny] = -1; // 사과를 먹으면 뱀의 몸통으로 표시 - } - - // 방향 전환 - if (!moves.empty() && time == moves.front().first) { - if (moves.front().second == 'L') { - direction = (direction + 3) % 4; // 왼쪽으로 회전 - } else { - direction = (direction + 1) % 4; // 오른쪽으로 회전 - } - moves.pop(); - } - - // 뱀의 머리 위치 업데이트 - board[snake.front().x][snake.front().y] = -1; - } - - return 0; -} +//추가 제출 예정 \ No newline at end of file From 2ad94554f89ad6f6dde68c54d52a18a6ea47bf61 Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Wed, 22 Nov 2023 22:52:52 +0900 Subject: [PATCH 15/15] =?UTF-8?q?231122=20=EC=B6=94=EA=B0=80=EC=A0=9C?= =?UTF-8?q?=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 12_tree/3190.cpp | 94 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/12_tree/3190.cpp b/12_tree/3190.cpp index 05d9def..3ff0684 100644 --- a/12_tree/3190.cpp +++ b/12_tree/3190.cpp @@ -1 +1,93 @@ -//추가 제출 예정 \ No newline at end of file +#include // 표준 입력 출력 스트림을 사용 +#include // 벡터 컨테이너 사용 +#include // 덱 컨테이너 사용 +#include // 맵 컨테이너 사용 + +using namespace std; // 표준 네임스페이스 사용 + +typedef pair ci; // 두 정수의 쌍을 나타내는 데이터 타입 정의 + +const int EMPTY = 0; // 빈칸 +const int APPLE = 1; // 사과 +const int SNAKE = 2; // 뱀 + +/** + * 게임이 몇 초에 끝나는지 계산하는 함수 + */ + +int playGame(int n, vector> &board, map &cmd) { + // 동(→), 남(↓), 서(←), 북(↑) 방향을 나타내는 배열 + int dx[4] = {0, -1, 0, 1}; + int dy[4] = {1, 0, -1, 0}; + + // 뱀의 위치 정보를 담는 덱 + deque snake; + snake.push_front({1, 1}); // 뱀의 초기 위치 설정 + board[1][1] = SNAKE; // 보드 상에 뱀의 위치 표시 + + int time = 0; // 현재 게임 시간 + int dir = 0; // 현재 뱀의 이동 방향 + + while (true) { + // 뱀의 방향 변환 정보가 있는 경우 + if (cmd[time] == 'L') { // 왼쪽으로 회전 + dir = (dir + 1) % 4; + } else if (cmd[time] == 'D') { // 오른쪽으로 회전 + dir = (dir + 3) % 4; + } + + // 게임 시간 증가 + time++; + + // 뱀의 다음 머리 위치 계산 + int nx = snake.front().first + dx[dir]; + int ny = snake.front().second + dy[dir]; + + // 게임 종료 조건: 벽에 부딪히거나 자신의 몸과 충돌 + if (nx < 1 || nx > n || ny < 1 || ny > n || board[nx][ny] == SNAKE) { + break; + } + + // 뱀 이동 처리 + snake.push_front({nx, ny}); // 머리 이동 + if (board[nx][ny] != APPLE) { // 사과가 없는 경우 꼬리 이동 + ci tail = snake.back(); + board[tail.first][tail.second] = EMPTY; + snake.pop_back(); + } + board[nx][ny] = SNAKE; // 뱀의 새로운 위치 표시 + } + return time; // 게임이 종료된 시간 반환 +} + +/** + * [백준 3190: 뱀] https://www.acmicpc.net/problem/3190 + * 뱀의 머리와 꼬리 좌표에 접근하기 위해 deque를 사용 + * 사과가 있는 위치는 APPLE(1), 뱀이 있는 위치는 SNAKE(2), 빈 공간은 EMPTY(0)으로 표시 + * 1. 뱀의 초기 위치 설정 + * 2. 뱀의 방향 변환 정보 입력 및 저장 + * 3. 게임 진행 및 결과 출력 + */ + +int main() { + int n, k, x, y, l, time; //보드 크기, 사과 개수, 사과 위치, 방향 전환 개수, 시간 + char command; //뱀 방향 변환 정보 + + // 입력 + cin >> n >> k; + vector> board(n + 1, vector(n + 1, EMPTY)); // n x n 크기의 보드 초기화 + while (k--) { + cin >> x >> y; + board[x][y] = APPLE; // 사과의 위치 표시 + } + cin >> l; + map cmd; // 시간별 뱀의 방향 변환 정보 저장 + while (l--) { + cin >> time >> command; + cmd[time] = command; + } + + // 게임 진행하고 결과 출력 + cout << playGame(n, board, cmd); + return 0; +}