From 03b7a2662b47ba1038fd46d7a4eeb1a79fdabe3b Mon Sep 17 00:00:00 2001 From: jaeeunHwang Date: Wed, 4 Oct 2023 11:56:41 +0900 Subject: [PATCH 01/11] 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 86437f98a273f17bcee14bb257bcd038bb2f23d8 Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Sun, 12 Nov 2023 22:10:37 +0900 Subject: [PATCH 02/11] =?UTF-8?q?231112=20=EC=B6=94=EA=B0=80=20=EC=A0=9C?= =?UTF-8?q?=EC=B6=9C?= 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 insertions(+) create mode 100644 "03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/1735.cpp" create mode 100644 "03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/2840.cpp" create 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" new file mode 100644 index 0000000..6ef3c47 --- /dev/null +++ "b/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/1735.cpp" @@ -0,0 +1,38 @@ +#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" new file mode 100644 index 0000000..a3e6b3f --- /dev/null +++ "b/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/2840.cpp" @@ -0,0 +1,67 @@ +#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" new file mode 100644 index 0000000..7e6a1f4 --- /dev/null +++ "b/03_\354\240\225\354\210\230\353\241\240/\355\225\204\354\210\230/6588.cpp" @@ -0,0 +1,73 @@ +#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 397b7fd413ba8bc9958c675c2e2aabb9b6c2b737 Mon Sep 17 00:00:00 2001 From: jaeeunHwang <98397375+jaeeunHwang@users.noreply.github.com> Date: Sun, 12 Nov 2023 22:16:42 +0900 Subject: [PATCH 03/11] =?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 --- .../\355\225\204\354\210\230/1213_h.cpp" | 64 +++++++++++++++ .../\355\225\204\354\210\230/17451_h.cpp" | 64 +++++++++++++++ .../\355\225\204\354\210\230/18111_h.cpp" | 80 +++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 "06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" create mode 100644 "06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" create 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" new file mode 100644 index 0000000..2101576 --- /dev/null +++ "b/06_greedy_algorithm/\355\225\204\354\210\230/1213_h.cpp" @@ -0,0 +1,64 @@ +#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" new file mode 100644 index 0000000..2101576 --- /dev/null +++ "b/06_greedy_algorithm/\355\225\204\354\210\230/17451_h.cpp" @@ -0,0 +1,64 @@ +#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" new file mode 100644 index 0000000..c3bf475 --- /dev/null +++ "b/06_greedy_algorithm/\355\225\204\354\210\230/18111_h.cpp" @@ -0,0 +1,80 @@ +#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 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 04/11] =?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 05/11] =?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 06/11] =?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 07/11] =?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 08/11] 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 09/11] =?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 10/11] =?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 11/11] 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; -}