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 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; -} 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; +} 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; +}