From 8e6d53c27126f9011ac2e40e7eefa4f1a574d597 Mon Sep 17 00:00:00 2001 From: Damin Oh <2271086@ewhain.net> Date: Tue, 8 Oct 2024 16:01:00 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[08=5FDFS=5FBFS]=2010=EC=9B=94=208=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\355\225\204\354\210\230/11053.cpp" | 35 ------ .../\355\225\204\354\210\230/20923.cpp" | 100 ---------------- .../\355\225\204\354\210\230/2579.cpp" | 40 ------- .../\353\217\204\354\240\204/10026.cpp" | 84 +++++++++++++ .../\353\217\204\354\240\204/14502.cpp" | 112 ++++++++++++++++++ .../\355\225\204\354\210\230/2606.cpp" | 48 ++++++++ .../\355\225\204\354\210\230/2615.cpp" | 79 ++++++++++++ .../\355\225\204\354\210\230/2644.cpp" | 70 +++++++++++ 8 files changed, 393 insertions(+), 175 deletions(-) delete mode 100644 "07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/11053.cpp" delete mode 100644 "07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/20923.cpp" delete mode 100644 "07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/2579.cpp" create mode 100644 "08_DFS_BFS/\353\217\204\354\240\204/10026.cpp" create mode 100644 "08_DFS_BFS/\353\217\204\354\240\204/14502.cpp" create mode 100644 "08_DFS_BFS/\355\225\204\354\210\230/2606.cpp" create mode 100644 "08_DFS_BFS/\355\225\204\354\210\230/2615.cpp" create mode 100644 "08_DFS_BFS/\355\225\204\354\210\230/2644.cpp" diff --git "a/07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/11053.cpp" "b/07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/11053.cpp" deleted file mode 100644 index f9d1d1e..0000000 --- "a/07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/11053.cpp" +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include -#include -using namespace std; - -int main() { - // 입출력 시간 단축 설정 - ios::sync_with_stdio(false); - cin.tie(NULL); - - int n; - cin >> n; // 수열의 크기 입력 - - vector arr(n); // 수열을 저장할 배열 - vector dp(n, 1); // 각 인덱스에서의 LIS 길이를 저장하는 DP 배열 (초기값 1) - - // 수열 입력 - for (int i = 0; i < n; i++) { - cin >> arr[i]; - } - - // 동적 프로그래밍을 이용하여 LIS 계산 - for (int i = 1; i < n; i++) { - for (int j = 0; j < i; j++) { - if (arr[i] > arr[j]) { - dp[i] = max(dp[i], dp[j] + 1); // 이전 값들 중에서 더 큰 값을 선택 - } - } - } - - // dp 배열에서 가장 큰 값이 가장 긴 증가하는 부분 수열의 길이 - cout << *max_element(dp.begin(), dp.end()) << '\n'; - - return 0; -} diff --git "a/07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/20923.cpp" "b/07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/20923.cpp" deleted file mode 100644 index c09d6e4..0000000 --- "a/07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/20923.cpp" +++ /dev/null @@ -1,100 +0,0 @@ -#include -#include - -using namespace std; - -// 게임 진행 함수 -string playGame(int cardCount, int rounds, deque &dodoDeck, deque &suyeonDeck) { - deque dodoGround; // 도도의 그라운드 카드더미 - deque suyeonGround; // 수연의 그라운드 카드더미 - - bool isDodoTurn = true; // true는 도도의 차례, false는 수연의 차례 - int currentRound = 0; // 게임 진행 횟수 - string winner; // 이긴 사람 - - while (true) { - currentRound++; // 게임 진행 횟수 증가 - - // 차례인 사람이 카드 내려놓기 - if (isDodoTurn) { // 도도의 차례 - dodoGround.push_back(dodoDeck.back()); // 도도가 카드 내려놓기 - dodoDeck.pop_back(); - } else { // 수연의 차례 - suyeonGround.push_back(suyeonDeck.back()); // 수연이가 카드 내려놓기 - suyeonDeck.pop_back(); - } - - // 0개 됐는지 체크 - if (dodoDeck.empty()) { // 도도의 카드 수가 0이면 - winner = "su"; - break; - } else if (suyeonDeck.empty()) { // 수연이의 카드 수가 0이면 - winner = "do"; - break; - } - - // 수연이가 종치기 - if (!dodoGround.empty() && !suyeonGround.empty() && - (dodoGround.back() + suyeonGround.back() == 5)) { - // 도도의 그라운드의 카드더미를 수연이의 덱 밑에 합치기 - while (!dodoGround.empty()) { - suyeonDeck.push_front(dodoGround.front()); - dodoGround.pop_front(); - } - // 수연의 그라운드의 카드더미를 수연이의 덱 밑에 합치기 - while (!suyeonGround.empty()) { - suyeonDeck.push_front(suyeonGround.front()); - suyeonGround.pop_front(); - } - } - // 도도가 종치기 - else if ((!dodoGround.empty() && dodoGround.back() == 5) || - (!suyeonGround.empty() && suyeonGround.back() == 5)) { - // 수연의 그라운드의 카드더미를 도도의 덱 밑에 합치기 - while (!suyeonGround.empty()) { - dodoDeck.push_front(suyeonGround.front()); - suyeonGround.pop_front(); - } - // 도도의 그라운드의 카드더미를 도도의 덱 밑에 합치기 - while (!dodoGround.empty()) { - dodoDeck.push_front(dodoGround.front()); - dodoGround.pop_front(); - } - } - - // M번 진행한 후 - if (currentRound == rounds) { - int dodoCardCount = dodoDeck.size(); - int suyeonCardCount = suyeonDeck.size(); - if (dodoCardCount < suyeonCardCount) { - winner = "su"; - } else if (dodoCardCount > suyeonCardCount) { - winner = "do"; - } else { - winner = "dosu"; - } - break; - } - - isDodoTurn = !isDodoTurn; // 차례를 바꾼다. - } - - return winner; // 게임의 승자를 return -} - -int main() { - int n, m; // n: 카드 수, m: 게임 진행 횟수 - cin >> n >> m; - - deque dodoDeck(n); // 도도의 카드 덱 - deque suyeonDeck(n); // 수연의 카드 덱 - - for (int i = 0; i < n; i++) { - cin >> dodoDeck[i] >> suyeonDeck[i]; - } - - string gameWinner = playGame(n, m, dodoDeck, suyeonDeck); // 게임 진행 - cout << gameWinner; // 승자 출력 - - return 0; -} diff --git "a/07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/2579.cpp" "b/07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/2579.cpp" deleted file mode 100644 index af0dfab..0000000 --- "a/07_\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/\355\225\204\354\210\230/2579.cpp" +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include -using namespace std; - -int main() { - // 입출력 시간 단축을 위한 설정 - ios::sync_with_stdio(false); - cin.tie(NULL); - - int numOfStairs; // 계단 수 - cin >> numOfStairs; - - int stairs[301] = {0}; // 계단 점수 배열 (최대 300) - int maxScore[301] = {0}; // 각 계단까지의 최댓값을 저장할 배열 - - // 계단 점수 입력 - for (int i = 1; i <= numOfStairs; i++) { - cin >> stairs[i]; - } - - // 첫 번째 계단 초기화 - maxScore[1] = stairs[1]; - - // 두 번째 계단 초기화 - if (numOfStairs > 1) { - maxScore[2] = stairs[1] + stairs[2]; - } - - // 세 번째 계단부터는 규칙에 따라 계산 - for (int i = 3; i <= numOfStairs; i++) { - // 세 개 연속 밟는 것을 피하기 위해 maxScore[i-2]에서 오는 경우와 - // maxScore[i-3]에서 두 개 연속 밟는 경우 중 큰 값 선택 - maxScore[i] = max(maxScore[i-2] + stairs[i], maxScore[i-3] + stairs[i-1] + stairs[i]); - } - - // 마지막 계단까지의 최댓값 출력 - cout << maxScore[numOfStairs] << '\n'; - - return 0; -} diff --git "a/08_DFS_BFS/\353\217\204\354\240\204/10026.cpp" "b/08_DFS_BFS/\353\217\204\354\240\204/10026.cpp" new file mode 100644 index 0000000..a2b73d8 --- /dev/null +++ "b/08_DFS_BFS/\353\217\204\354\240\204/10026.cpp" @@ -0,0 +1,84 @@ +// 적록색약 x: 빨, 초, 파 구분 +// 적록색약 o: 빨=초, 파 구분 +// 구역 탐색에 DFS 이용. + +#include +#include +#include +using namespace std; + +const int MAX = 100; +char grid[MAX][MAX]; // 원본 그리드 +bool visited[MAX][MAX]; // 방문 여부 체크 +int dx[] = {-1, 1, 0, 0}; // 상하좌우 탐색을 위한 방향 벡터 +int dy[] = {0, 0, -1, 1}; +int n; + +// DFS로 구역을 탐색하는 함수 +void dfs(int x, int y, char color) { + visited[x][y] = true; + + for (int i = 0; i < 4; i++) { + int nx = x + dx[i]; + int ny = y + dy[i]; + + // 지도 범위를 벗어나지 않고, 같은 색상인 경우 DFS 계속 진행 + if (nx >= 0 && ny >= 0 && nx < n && ny < n && !visited[nx][ny] && grid[nx][ny] == color) { + dfs(nx, ny, color); + } + } +} + +// 적록색약 처리: R -> G 변환 +void convert() { + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (grid[i][j] == 'R') { + grid[i][j] = 'G'; + } + } + } +} + +int main() { + ios::sync_with_stdio(false); + cin.tie(0); + + // 입력 받기 + cin >> n; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + cin >> grid[i][j]; + } + } + + // 적록색약 x 경우 + int normal_count = 0; + fill(&visited[0][0], &visited[0][0] + MAX * MAX, false); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (!visited[i][j]) { + dfs(i, j, grid[i][j]); + normal_count++; + } + } + } + + // 적록색약 o 경우 + int color_blind_count = 0; + convert(); // 적록색약 처리를 위해 변환 + fill(&visited[0][0], &visited[0][0] + MAX * MAX, false); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (!visited[i][j]) { + dfs(i, j, grid[i][j]); + color_blind_count++; + } + } + } + + // 결과 출력 + cout << normal_count << ' ' << color_blind_count << '\n'; + + return 0; +} diff --git "a/08_DFS_BFS/\353\217\204\354\240\204/14502.cpp" "b/08_DFS_BFS/\353\217\204\354\240\204/14502.cpp" new file mode 100644 index 0000000..dd2ec49 --- /dev/null +++ "b/08_DFS_BFS/\353\217\204\354\240\204/14502.cpp" @@ -0,0 +1,112 @@ +#include +#include +#include +#include +using namespace std; + +// 벽을 세우기 위한 모든 경우의 수를 탐색. 빈칸 중 3개의 칸을 선택하여 벽을 세우는 조합을 구해야 한다. +// DFS, BFS 함께 사용하는 백트래킹 문제. + +const int MAX = 8; +int n, m; +int lab[MAX][MAX]; // 연구소 지도 +int temp_lab[MAX][MAX]; // 벽을 세운 후의 임시 지도 +int dx[] = {0, 0, 1, -1}; // 방향 벡터 (상, 하, 좌, 우) +int dy[] = {1, -1, 0, 0}; +int max_safe_area = 0; // 최대 안전 영역 크기 + +// 바이러스를 퍼뜨리기 (BFS 사용) +void spread_virus() { + int spread_lab[MAX][MAX]; + queue> q; + + // temp_lab을 복사해서 spread_lab에 저장 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + spread_lab[i][j] = temp_lab[i][j]; + if (spread_lab[i][j] == 2) { + q.push({i, j}); // 바이러스가 있는 위치 저장 + } + } + } + + // BFS로 바이러스를 퍼뜨리기 + while (!q.empty()) { + int x = q.front().first; + int y = q.front().second; + q.pop(); + + for (int i = 0; i < 4; i++) { + int nx = x + dx[i]; + int ny = y + dy[i]; + + // 지도 범위 안에 있는 경우 && 빈 칸인 경우 -> 바이러스를 퍼뜨림 + if (nx >= 0 && ny >= 0 && nx < n && ny < m && spread_lab[nx][ny] == 0) { + spread_lab[nx][ny] = 2; + q.push({nx, ny}); + } + } + } + + // 크기 계산 + int safe_area = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (spread_lab[i][j] == 0) { + safe_area++; + } + } + } + + // 갱신 + max_safe_area = max(max_safe_area, safe_area); +} + +// 벽 세우기 (백트래킹) +void build_wall(int count) { + // 벽 3개를 다 세운 경우, 바이러스를 퍼뜨림 + if (count == 3) { + spread_virus(); + return; + } + + // 빈 칸에 벽 세우기 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (temp_lab[i][j] == 0) { + temp_lab[i][j] = 1; // 벽을 세움 + build_wall(count + 1); // 다음 벽 세우기 + temp_lab[i][j] = 0; // 원상 복구 + } + } + } +} + +int main() { + ios::sync_with_stdio(false); + cin.tie(0); + + cin >> n >> m; + + // 연구소 입력 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> lab[i][j]; + } + } + + // 연구소 상태를 복사해둔다. + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + temp_lab[i][j] = lab[i][j]; + } + } + + // 벽 세우기 시작 + build_wall(0); + + // 최대 안전 영역 출력 + cout << max_safe_area << '\n'; + + return 0; +} diff --git "a/08_DFS_BFS/\355\225\204\354\210\230/2606.cpp" "b/08_DFS_BFS/\355\225\204\354\210\230/2606.cpp" new file mode 100644 index 0000000..8549887 --- /dev/null +++ "b/08_DFS_BFS/\355\225\204\354\210\230/2606.cpp" @@ -0,0 +1,48 @@ +#include +#include +using namespace std; + +const int MAX = 100; // 최대 컴퓨터 개수 +vector network[MAX + 1]; // 네트워크 연결 정보 +bool visited[MAX + 1]; // 방문 여부 확인 배열 +int infected_count = 0; // 감염된 컴퓨터 수 + +// DFS로 바이러스 전파 탐색 +void dfs(int computer) { + visited[computer] = true; + infected_count++; // 감염된 컴퓨터 수 증가 + + // 현재 컴퓨터와 연결된 다른 컴퓨터 탐색 + for (int next : network[computer]) { + if (!visited[next]) { // 아직 방문하지 않은 컴퓨터라면 + dfs(next); // 해당 컴퓨터로 이동 + } + } +} + +int main() { + ios::sync_with_stdio(false); // 입출력 속도 향상 + cin.tie(nullptr); + + int n; // 컴퓨터 수 + cin >> n; + + int m; // 네트워크 상에서 연결된 컴퓨터 쌍 개수 + cin >> m; + + // 네트워크 연결 정보 입력 + for (int i = 0; i < m; ++i) { + int u, v; + cin >> u >> v; + network[u].push_back(v); + network[v].push_back(u); // 양방향 연결 + } + + // DFS로 1번 컴퓨터에서 바이러스 전파 시작 + dfs(1); + + // 1번 컴퓨터는 제외하고 출력해야 하므로 -1을 해 줘야 한다. + cout << infected_count - 1 << '\n'; + + return 0; +} diff --git "a/08_DFS_BFS/\355\225\204\354\210\230/2615.cpp" "b/08_DFS_BFS/\355\225\204\354\210\230/2615.cpp" new file mode 100644 index 0000000..51d1099 --- /dev/null +++ "b/08_DFS_BFS/\355\225\204\354\210\230/2615.cpp" @@ -0,0 +1,79 @@ +#include +using namespace std; + +const int board_size = 19; // 바둑판 크기 +int board[board_size][board_size]; + +// 방향: 오른쪽, 아래, 대각선 오른쪽 아래, 대각선 왼쪽 아래 +int dx[4] = {0, 1, 1, -1}; +int dy[4] = {1, 0, 1, 1}; + +// 좌표가 유효한지 확인 +bool is_valid(int x, int y) { + return x >= 0 && x < board_size && y >= 0 && y < board_size; +} + +// 승리 여부를 확인 +bool check_win(int x, int y, int color) { + // 4방향 확인 + for (int dir = 0; dir < 4; ++dir) { + int count = 1; // 현재 바둑알 포함 + int nx = x + dx[dir], ny = y + dy[dir]; + + // 동일한 색의 바둑알이 연속으로 있는지 확인 + while (is_valid(nx, ny) && board[nx][ny] == color) { + count++; + nx += dx[dir]; + ny += dy[dir]; + } + + // 반대 방향 확인 + nx = x - dx[dir], ny = y - dy[dir]; + while (is_valid(nx, ny) && board[nx][ny] == color) { + count++; + nx -= dx[dir]; + ny -= dy[dir]; + } + + // 5개의 바둑알이 연속된 경우 + if (count == 5) { + // 이전 좌표가 유효하지 않거나 다른 색인 경우만 승리 인정 + int prev_x = x - dx[dir], prev_y = y - dy[dir]; + if (!is_valid(prev_x, prev_y) || board[prev_x][prev_y] != color) { + cout << color << '\n'; + cout << x + 1 << ' ' << y + 1 << '\n'; // 1-based index로 출력 + return true; + } + } + } + return false; +} + +int main() { + // 입출력 속도 향상 + ios::sync_with_stdio(false); + cin.tie(nullptr); + + // 바둑판 입력 + for (int i = 0; i < board_size; ++i) { + for (int j = 0; j < board_size; ++j) { + cin >> board[i][j]; + } + } + + // 바둑판에서 승리 여부 확인 + for (int i = 0; i < board_size; ++i) { + for (int j = 0; j < board_size; ++j) { + if (board[i][j] != 0) { + // 현재 위치에서 승리 확인 + if (check_win(i, j, board[i][j])) { + return 0; + } + } + } + } + + // 승부가 나지 않았을 경우 + cout << 0 << '\n'; + return 0; +} diff --git "a/08_DFS_BFS/\355\225\204\354\210\230/2644.cpp" "b/08_DFS_BFS/\355\225\204\354\210\230/2644.cpp" new file mode 100644 index 0000000..7f27ce1 --- /dev/null +++ "b/08_DFS_BFS/\355\225\204\354\210\230/2644.cpp" @@ -0,0 +1,70 @@ +#include +#include +#include +using namespace std; + +const int MAX = 100; // 최대 사람 수 +vector relations[MAX + 1]; // 관계를 저장 -> 인접 리스트 +int visited[MAX + 1]; // 방문 여부, 촌수를 저장하는 배열 + +// BFS로 두 사람 간의 촌수를 계산 +int calculate_relation(int start, int target) { + queue q; + q.push(start); + visited[start] = 0; // 시작점: 자기 자신, 0촌 + + while (!q.empty()) { + int current = q.front(); + q.pop(); + + // 목표 사람에 도달하면 그때의 촌수 반환 + if (current == target) { + return visited[current]; + } + + // 현재 사람과 연결된 사람들을 모두 확인 + for (int next : relations[current]) { + if (visited[next] == -1) { // 아직 방문하지 않은 경우만 + visited[next] = visited[current] + 1; // 촌수 증가 + q.push(next); + } + } + } + + // 목표 사람에 도달하지 못하면 -1 반환 + return -1; +} + +int main() { + ios::sync_with_stdio(false); // 입출력 최적화 + cin.tie(nullptr); + + int n; // 전체 사람 수 + cin >> n; + + int person1, person2; + cin >> person1 >> person2; // 촌수 계산 대상 + + int m; // 부모 자식 관계 수 + cin >> m; + + // 부모-자식 관계 입력 + for (int i = 0; i < m; ++i) { + int parent, child; + cin >> parent >> child; + relations[parent].push_back(child); + relations[child].push_back(parent); // 양방향으로 관계 저장 + } + + // 방문 배열을 -1로 초기화 + for (int i = 1; i <= n; ++i) { + visited[i] = -1; + } + + // 두 사람 간의 촌수를 계산 + int result = calculate_relation(person1, person2); + + cout << result << '\n'; + + return 0; +} From 197ccb7742ddda51091459d14d5dca813825582f Mon Sep 17 00:00:00 2001 From: Damin Oh <2271086@ewhain.net> Date: Tue, 15 Oct 2024 12:15:15 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[09=5F=EB=B0=B1=ED=8A=B8=EB=9E=98=ED=82=B9]?= =?UTF-8?q?=2010=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/10026.cpp" | 84 ------------- .../\353\217\204\354\240\204/14502.cpp" | 112 ------------------ .../\355\225\204\354\210\230/2606.cpp" | 48 -------- .../\355\225\204\354\210\230/2615.cpp" | 79 ------------ .../\355\225\204\354\210\230/2644.cpp" | 70 ----------- .../\355\225\204\354\210\230/14888.cpp" | 73 ++++++++++++ .../\355\225\204\354\210\230/15665.cpp" | 53 +++++++++ .../\355\225\204\354\210\230/2477.cpp" | 54 +++++++++ 8 files changed, 180 insertions(+), 393 deletions(-) delete mode 100644 "08_DFS_BFS/\353\217\204\354\240\204/10026.cpp" delete mode 100644 "08_DFS_BFS/\353\217\204\354\240\204/14502.cpp" delete mode 100644 "08_DFS_BFS/\355\225\204\354\210\230/2606.cpp" delete mode 100644 "08_DFS_BFS/\355\225\204\354\210\230/2615.cpp" delete mode 100644 "08_DFS_BFS/\355\225\204\354\210\230/2644.cpp" create mode 100644 "09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/14888.cpp" create mode 100644 "09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/15665.cpp" create mode 100644 "09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/2477.cpp" diff --git "a/08_DFS_BFS/\353\217\204\354\240\204/10026.cpp" "b/08_DFS_BFS/\353\217\204\354\240\204/10026.cpp" deleted file mode 100644 index a2b73d8..0000000 --- "a/08_DFS_BFS/\353\217\204\354\240\204/10026.cpp" +++ /dev/null @@ -1,84 +0,0 @@ -// 적록색약 x: 빨, 초, 파 구분 -// 적록색약 o: 빨=초, 파 구분 -// 구역 탐색에 DFS 이용. - -#include -#include -#include -using namespace std; - -const int MAX = 100; -char grid[MAX][MAX]; // 원본 그리드 -bool visited[MAX][MAX]; // 방문 여부 체크 -int dx[] = {-1, 1, 0, 0}; // 상하좌우 탐색을 위한 방향 벡터 -int dy[] = {0, 0, -1, 1}; -int n; - -// DFS로 구역을 탐색하는 함수 -void dfs(int x, int y, char color) { - visited[x][y] = true; - - for (int i = 0; i < 4; i++) { - int nx = x + dx[i]; - int ny = y + dy[i]; - - // 지도 범위를 벗어나지 않고, 같은 색상인 경우 DFS 계속 진행 - if (nx >= 0 && ny >= 0 && nx < n && ny < n && !visited[nx][ny] && grid[nx][ny] == color) { - dfs(nx, ny, color); - } - } -} - -// 적록색약 처리: R -> G 변환 -void convert() { - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - if (grid[i][j] == 'R') { - grid[i][j] = 'G'; - } - } - } -} - -int main() { - ios::sync_with_stdio(false); - cin.tie(0); - - // 입력 받기 - cin >> n; - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - cin >> grid[i][j]; - } - } - - // 적록색약 x 경우 - int normal_count = 0; - fill(&visited[0][0], &visited[0][0] + MAX * MAX, false); - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - if (!visited[i][j]) { - dfs(i, j, grid[i][j]); - normal_count++; - } - } - } - - // 적록색약 o 경우 - int color_blind_count = 0; - convert(); // 적록색약 처리를 위해 변환 - fill(&visited[0][0], &visited[0][0] + MAX * MAX, false); - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - if (!visited[i][j]) { - dfs(i, j, grid[i][j]); - color_blind_count++; - } - } - } - - // 결과 출력 - cout << normal_count << ' ' << color_blind_count << '\n'; - - return 0; -} diff --git "a/08_DFS_BFS/\353\217\204\354\240\204/14502.cpp" "b/08_DFS_BFS/\353\217\204\354\240\204/14502.cpp" deleted file mode 100644 index dd2ec49..0000000 --- "a/08_DFS_BFS/\353\217\204\354\240\204/14502.cpp" +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include -#include -#include -using namespace std; - -// 벽을 세우기 위한 모든 경우의 수를 탐색. 빈칸 중 3개의 칸을 선택하여 벽을 세우는 조합을 구해야 한다. -// DFS, BFS 함께 사용하는 백트래킹 문제. - -const int MAX = 8; -int n, m; -int lab[MAX][MAX]; // 연구소 지도 -int temp_lab[MAX][MAX]; // 벽을 세운 후의 임시 지도 -int dx[] = {0, 0, 1, -1}; // 방향 벡터 (상, 하, 좌, 우) -int dy[] = {1, -1, 0, 0}; -int max_safe_area = 0; // 최대 안전 영역 크기 - -// 바이러스를 퍼뜨리기 (BFS 사용) -void spread_virus() { - int spread_lab[MAX][MAX]; - queue> q; - - // temp_lab을 복사해서 spread_lab에 저장 - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - spread_lab[i][j] = temp_lab[i][j]; - if (spread_lab[i][j] == 2) { - q.push({i, j}); // 바이러스가 있는 위치 저장 - } - } - } - - // BFS로 바이러스를 퍼뜨리기 - while (!q.empty()) { - int x = q.front().first; - int y = q.front().second; - q.pop(); - - for (int i = 0; i < 4; i++) { - int nx = x + dx[i]; - int ny = y + dy[i]; - - // 지도 범위 안에 있는 경우 && 빈 칸인 경우 -> 바이러스를 퍼뜨림 - if (nx >= 0 && ny >= 0 && nx < n && ny < m && spread_lab[nx][ny] == 0) { - spread_lab[nx][ny] = 2; - q.push({nx, ny}); - } - } - } - - // 크기 계산 - int safe_area = 0; - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - if (spread_lab[i][j] == 0) { - safe_area++; - } - } - } - - // 갱신 - max_safe_area = max(max_safe_area, safe_area); -} - -// 벽 세우기 (백트래킹) -void build_wall(int count) { - // 벽 3개를 다 세운 경우, 바이러스를 퍼뜨림 - if (count == 3) { - spread_virus(); - return; - } - - // 빈 칸에 벽 세우기 - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - if (temp_lab[i][j] == 0) { - temp_lab[i][j] = 1; // 벽을 세움 - build_wall(count + 1); // 다음 벽 세우기 - temp_lab[i][j] = 0; // 원상 복구 - } - } - } -} - -int main() { - ios::sync_with_stdio(false); - cin.tie(0); - - cin >> n >> m; - - // 연구소 입력 - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - cin >> lab[i][j]; - } - } - - // 연구소 상태를 복사해둔다. - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - temp_lab[i][j] = lab[i][j]; - } - } - - // 벽 세우기 시작 - build_wall(0); - - // 최대 안전 영역 출력 - cout << max_safe_area << '\n'; - - return 0; -} diff --git "a/08_DFS_BFS/\355\225\204\354\210\230/2606.cpp" "b/08_DFS_BFS/\355\225\204\354\210\230/2606.cpp" deleted file mode 100644 index 8549887..0000000 --- "a/08_DFS_BFS/\355\225\204\354\210\230/2606.cpp" +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -using namespace std; - -const int MAX = 100; // 최대 컴퓨터 개수 -vector network[MAX + 1]; // 네트워크 연결 정보 -bool visited[MAX + 1]; // 방문 여부 확인 배열 -int infected_count = 0; // 감염된 컴퓨터 수 - -// DFS로 바이러스 전파 탐색 -void dfs(int computer) { - visited[computer] = true; - infected_count++; // 감염된 컴퓨터 수 증가 - - // 현재 컴퓨터와 연결된 다른 컴퓨터 탐색 - for (int next : network[computer]) { - if (!visited[next]) { // 아직 방문하지 않은 컴퓨터라면 - dfs(next); // 해당 컴퓨터로 이동 - } - } -} - -int main() { - ios::sync_with_stdio(false); // 입출력 속도 향상 - cin.tie(nullptr); - - int n; // 컴퓨터 수 - cin >> n; - - int m; // 네트워크 상에서 연결된 컴퓨터 쌍 개수 - cin >> m; - - // 네트워크 연결 정보 입력 - for (int i = 0; i < m; ++i) { - int u, v; - cin >> u >> v; - network[u].push_back(v); - network[v].push_back(u); // 양방향 연결 - } - - // DFS로 1번 컴퓨터에서 바이러스 전파 시작 - dfs(1); - - // 1번 컴퓨터는 제외하고 출력해야 하므로 -1을 해 줘야 한다. - cout << infected_count - 1 << '\n'; - - return 0; -} diff --git "a/08_DFS_BFS/\355\225\204\354\210\230/2615.cpp" "b/08_DFS_BFS/\355\225\204\354\210\230/2615.cpp" deleted file mode 100644 index 51d1099..0000000 --- "a/08_DFS_BFS/\355\225\204\354\210\230/2615.cpp" +++ /dev/null @@ -1,79 +0,0 @@ -#include -using namespace std; - -const int board_size = 19; // 바둑판 크기 -int board[board_size][board_size]; - -// 방향: 오른쪽, 아래, 대각선 오른쪽 아래, 대각선 왼쪽 아래 -int dx[4] = {0, 1, 1, -1}; -int dy[4] = {1, 0, 1, 1}; - -// 좌표가 유효한지 확인 -bool is_valid(int x, int y) { - return x >= 0 && x < board_size && y >= 0 && y < board_size; -} - -// 승리 여부를 확인 -bool check_win(int x, int y, int color) { - // 4방향 확인 - for (int dir = 0; dir < 4; ++dir) { - int count = 1; // 현재 바둑알 포함 - int nx = x + dx[dir], ny = y + dy[dir]; - - // 동일한 색의 바둑알이 연속으로 있는지 확인 - while (is_valid(nx, ny) && board[nx][ny] == color) { - count++; - nx += dx[dir]; - ny += dy[dir]; - } - - // 반대 방향 확인 - nx = x - dx[dir], ny = y - dy[dir]; - while (is_valid(nx, ny) && board[nx][ny] == color) { - count++; - nx -= dx[dir]; - ny -= dy[dir]; - } - - // 5개의 바둑알이 연속된 경우 - if (count == 5) { - // 이전 좌표가 유효하지 않거나 다른 색인 경우만 승리 인정 - int prev_x = x - dx[dir], prev_y = y - dy[dir]; - if (!is_valid(prev_x, prev_y) || board[prev_x][prev_y] != color) { - cout << color << '\n'; - cout << x + 1 << ' ' << y + 1 << '\n'; // 1-based index로 출력 - return true; - } - } - } - return false; -} - -int main() { - // 입출력 속도 향상 - ios::sync_with_stdio(false); - cin.tie(nullptr); - - // 바둑판 입력 - for (int i = 0; i < board_size; ++i) { - for (int j = 0; j < board_size; ++j) { - cin >> board[i][j]; - } - } - - // 바둑판에서 승리 여부 확인 - for (int i = 0; i < board_size; ++i) { - for (int j = 0; j < board_size; ++j) { - if (board[i][j] != 0) { - // 현재 위치에서 승리 확인 - if (check_win(i, j, board[i][j])) { - return 0; - } - } - } - } - - // 승부가 나지 않았을 경우 - cout << 0 << '\n'; - return 0; -} diff --git "a/08_DFS_BFS/\355\225\204\354\210\230/2644.cpp" "b/08_DFS_BFS/\355\225\204\354\210\230/2644.cpp" deleted file mode 100644 index 7f27ce1..0000000 --- "a/08_DFS_BFS/\355\225\204\354\210\230/2644.cpp" +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include -#include -using namespace std; - -const int MAX = 100; // 최대 사람 수 -vector relations[MAX + 1]; // 관계를 저장 -> 인접 리스트 -int visited[MAX + 1]; // 방문 여부, 촌수를 저장하는 배열 - -// BFS로 두 사람 간의 촌수를 계산 -int calculate_relation(int start, int target) { - queue q; - q.push(start); - visited[start] = 0; // 시작점: 자기 자신, 0촌 - - while (!q.empty()) { - int current = q.front(); - q.pop(); - - // 목표 사람에 도달하면 그때의 촌수 반환 - if (current == target) { - return visited[current]; - } - - // 현재 사람과 연결된 사람들을 모두 확인 - for (int next : relations[current]) { - if (visited[next] == -1) { // 아직 방문하지 않은 경우만 - visited[next] = visited[current] + 1; // 촌수 증가 - q.push(next); - } - } - } - - // 목표 사람에 도달하지 못하면 -1 반환 - return -1; -} - -int main() { - ios::sync_with_stdio(false); // 입출력 최적화 - cin.tie(nullptr); - - int n; // 전체 사람 수 - cin >> n; - - int person1, person2; - cin >> person1 >> person2; // 촌수 계산 대상 - - int m; // 부모 자식 관계 수 - cin >> m; - - // 부모-자식 관계 입력 - for (int i = 0; i < m; ++i) { - int parent, child; - cin >> parent >> child; - relations[parent].push_back(child); - relations[child].push_back(parent); // 양방향으로 관계 저장 - } - - // 방문 배열을 -1로 초기화 - for (int i = 1; i <= n; ++i) { - visited[i] = -1; - } - - // 두 사람 간의 촌수를 계산 - int result = calculate_relation(person1, person2); - - cout << result << '\n'; - - return 0; -} diff --git "a/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/14888.cpp" "b/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/14888.cpp" new file mode 100644 index 0000000..f50a12e --- /dev/null +++ "b/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/14888.cpp" @@ -0,0 +1,73 @@ +#include +#include +#include +using namespace std; + +// 최대값과 최소값을 저장할 변수 +int max_result = -1e9; // -10억 +int min_result = 1e9; // 10억 + +// 백트래킹을 위한 함수 +void calculate(int idx, int current_value, vector& numbers, vector& operators) { + // 모든 숫자를 다 사용한 경우, 최댓값과 최솟값 갱신 + if (idx == numbers.size()) { + max_result = max(max_result, current_value); + min_result = min(min_result, current_value); + return; + } + + + // 4개의 연산자에 대해 반복문으로 처리 + for (int i = 0; i < 4; ++i) { + if (operators[i] > 0) { // 해당 연산자가 남아 있는 경우에만 수행 + operators[i]--; // 연산자 사용 + + // 연산에 따른 계산 수행 + if (i == 0) { + // 덧셈 + calculate(idx + 1, current_value + numbers[idx], numbers, operators); + } else if (i == 1) { + // 뺄셈 + calculate(idx + 1, current_value - numbers[idx], numbers, operators); + } else if (i == 2) { + // 곱셈 + calculate(idx + 1, current_value * numbers[idx], numbers, operators); + } else if (i == 3) { + // 나눗셈 (C++14의 음수 나눗셈 처리 포함) + if (current_value < 0) { + calculate(idx + 1, -(-current_value / numbers[idx]), numbers, operators); + } else { + calculate(idx + 1, current_value / numbers[idx], numbers, operators); + } + } + + operators[i]++; // 백트래킹 후 연산자 복구 + } + } +} + +int main() { + ios_base::sync_with_stdio(false); // 입출력 성능 최적화 + cin.tie(nullptr); // 입출력 성능 최적화 + + int n; // 숫자의 개수 + cin >> n; + + vector numbers(n); // 숫자들을 저장하는 벡터 + for (int i = 0; i < n; i++) { + cin >> numbers[i]; + } + + vector operators(4); // 연산자들의 개수: 덧셈, 뺄셈, 곱셈, 나눗셈 순 + for (int i = 0; i < 4; i++) { + cin >> operators[i]; + } + + // 백트래킹 시작 + calculate(1, numbers[0], numbers, operators); + + // 결과 출력 + cout << max_result << '\n' << min_result << '\n'; + + return 0; +} diff --git "a/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/15665.cpp" "b/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/15665.cpp" new file mode 100644 index 0000000..b6157c8 --- /dev/null +++ "b/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/15665.cpp" @@ -0,0 +1,53 @@ +#include +#include +#include +#include +using namespace std; + +int n, m; +vector numbers; +vector sequence; +set> result_set; // 중복을 방지하기 위한 set + +// 중복을 허용하여 M개의 수를 고른 수열을 저장하는 백트래킹 함수 +void generate_sequence(int depth) { + if (depth == m) { + result_set.insert(sequence); // 중복이 없도록 set에 저장 + return; + } + + for (int i = 0; i < n; i++) { + sequence[depth] = numbers[i]; + generate_sequence(depth + 1); + } +} + +int main() { + ios_base::sync_with_stdio(false); // 입출력 성능 최적화 + cin.tie(nullptr); // 입출력 성능 최적화 + + cin >> n >> m; + numbers.resize(n); + sequence.resize(m); + + // 수 입력 받기 + for (int i = 0; i < n; i++) { + cin >> numbers[i]; + } + + // 사전 순 출력을 위해 정렬 + sort(numbers.begin(), numbers.end()); + + // 수열 생성 시작 + generate_sequence(0); + + // 저장된 결과를 출력 + for (const auto& seq : result_set) { + for (int num : seq) { + cout << num << ' '; + } + cout << '\n'; + } + + return 0; +} diff --git "a/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/2477.cpp" "b/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/2477.cpp" new file mode 100644 index 0000000..bc94f29 --- /dev/null +++ "b/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/2477.cpp" @@ -0,0 +1,54 @@ +#include +using namespace std; + +// 참외밭 면적을 계산하는 함수 +int calculate_area(int k, int directions[], int lengths[]) { + int max_width = 0, max_height = 0; // 최대 가로, 세로 길이 + int width_idx = 0, height_idx = 0; // 최대 길이의 인덱스 저장 + + // 가장 긴 가로와 세로 변 찾기 + for (int i = 0; i < 6; i++) { + // 동쪽(1)과 서쪽(2) 방향 (==가로) + if (directions[i] == 1 || directions[i] == 2) { + if (lengths[i] > max_width) { + max_width = lengths[i]; // 최대 가로 길이 갱신 + width_idx = i; // 가로 길이 인덱스 저장 + } + } + // 남쪽(3)과 북쪽(4) 방향 (==세로) + else if (directions[i] == 3 || directions[i] == 4) { + if (lengths[i] > max_height) { + max_height = lengths[i]; // 최대 세로 길이 갱신 + height_idx = i; // 세로 길이 인덱스 저장 + } + } + } + + // 작은 사각형의 너비와 높이 계산 (현재 최대 길이의 대칭 변) + int small_width = lengths[(width_idx + 3) % 6]; // 가로 길이의 대칭 변 + int small_height = lengths[(height_idx + 3) % 6]; // 세로 길이의 대칭 변 + + // (총 면적) = 가장 큰 사각형) - (안의 작은 사각형) + int area = (max_width * max_height) - (small_width * small_height); + + // 최종 참외 개수 계산 + return area * k; // 총 참외 개수 반환 +} + +int main() { + int k; // 1m²당 참외 개수 + cin >> k; + + int directions[6]; // 방향을 저장할 배열 + int lengths[6]; // 길이를 저장할 배열 + + // 방향과 길이 입력 받기 + for (int i = 0; i < 6; i++) { + cin >> directions[i] >> lengths[i]; + } + + // 면적 계산 및 결과 출력 + cout << calculate_area(k, directions, lengths) << "\n"; + + return 0; +} From 3784024f156cdc6e8bd57f5ce364eb0307100648 Mon Sep 17 00:00:00 2001 From: Damin Oh <2271086@ewhain.net> Date: Mon, 4 Nov 2024 05:43:48 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[11=EC=9B=94=204=EC=9D=BC]=20=EC=9D=B4?= =?UTF-8?q?=EB=B6=84=ED=83=90=EC=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\355\225\204\354\210\230/14888.cpp" | 73 ------------------- .../\355\225\204\354\210\230/15665.cpp" | 53 -------------- .../\355\225\204\354\210\230/2477.cpp" | 54 -------------- .../\353\217\204\354\240\204/2343.cpp" | 59 +++++++++++++++ .../\353\217\204\354\240\204/3079.cpp" | 44 +++++++++++ .../\355\225\204\354\210\230/10815.cpp" | 42 +++++++++++ .../\355\225\204\354\210\230/16401.cpp" | 43 +++++++++++ .../\355\225\204\354\210\230/17266.cpp" | 38 ++++++++++ 8 files changed, 226 insertions(+), 180 deletions(-) delete mode 100644 "09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/14888.cpp" delete mode 100644 "09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/15665.cpp" delete mode 100644 "09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/2477.cpp" create mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/2343.cpp" create mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/3079.cpp" create mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/10815.cpp" create mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/16401.cpp" create mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/17266.cpp" diff --git "a/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/14888.cpp" "b/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/14888.cpp" deleted file mode 100644 index f50a12e..0000000 --- "a/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/14888.cpp" +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include -using namespace std; - -// 최대값과 최소값을 저장할 변수 -int max_result = -1e9; // -10억 -int min_result = 1e9; // 10억 - -// 백트래킹을 위한 함수 -void calculate(int idx, int current_value, vector& numbers, vector& operators) { - // 모든 숫자를 다 사용한 경우, 최댓값과 최솟값 갱신 - if (idx == numbers.size()) { - max_result = max(max_result, current_value); - min_result = min(min_result, current_value); - return; - } - - - // 4개의 연산자에 대해 반복문으로 처리 - for (int i = 0; i < 4; ++i) { - if (operators[i] > 0) { // 해당 연산자가 남아 있는 경우에만 수행 - operators[i]--; // 연산자 사용 - - // 연산에 따른 계산 수행 - if (i == 0) { - // 덧셈 - calculate(idx + 1, current_value + numbers[idx], numbers, operators); - } else if (i == 1) { - // 뺄셈 - calculate(idx + 1, current_value - numbers[idx], numbers, operators); - } else if (i == 2) { - // 곱셈 - calculate(idx + 1, current_value * numbers[idx], numbers, operators); - } else if (i == 3) { - // 나눗셈 (C++14의 음수 나눗셈 처리 포함) - if (current_value < 0) { - calculate(idx + 1, -(-current_value / numbers[idx]), numbers, operators); - } else { - calculate(idx + 1, current_value / numbers[idx], numbers, operators); - } - } - - operators[i]++; // 백트래킹 후 연산자 복구 - } - } -} - -int main() { - ios_base::sync_with_stdio(false); // 입출력 성능 최적화 - cin.tie(nullptr); // 입출력 성능 최적화 - - int n; // 숫자의 개수 - cin >> n; - - vector numbers(n); // 숫자들을 저장하는 벡터 - for (int i = 0; i < n; i++) { - cin >> numbers[i]; - } - - vector operators(4); // 연산자들의 개수: 덧셈, 뺄셈, 곱셈, 나눗셈 순 - for (int i = 0; i < 4; i++) { - cin >> operators[i]; - } - - // 백트래킹 시작 - calculate(1, numbers[0], numbers, operators); - - // 결과 출력 - cout << max_result << '\n' << min_result << '\n'; - - return 0; -} diff --git "a/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/15665.cpp" "b/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/15665.cpp" deleted file mode 100644 index b6157c8..0000000 --- "a/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/15665.cpp" +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include -#include -#include -using namespace std; - -int n, m; -vector numbers; -vector sequence; -set> result_set; // 중복을 방지하기 위한 set - -// 중복을 허용하여 M개의 수를 고른 수열을 저장하는 백트래킹 함수 -void generate_sequence(int depth) { - if (depth == m) { - result_set.insert(sequence); // 중복이 없도록 set에 저장 - return; - } - - for (int i = 0; i < n; i++) { - sequence[depth] = numbers[i]; - generate_sequence(depth + 1); - } -} - -int main() { - ios_base::sync_with_stdio(false); // 입출력 성능 최적화 - cin.tie(nullptr); // 입출력 성능 최적화 - - cin >> n >> m; - numbers.resize(n); - sequence.resize(m); - - // 수 입력 받기 - for (int i = 0; i < n; i++) { - cin >> numbers[i]; - } - - // 사전 순 출력을 위해 정렬 - sort(numbers.begin(), numbers.end()); - - // 수열 생성 시작 - generate_sequence(0); - - // 저장된 결과를 출력 - for (const auto& seq : result_set) { - for (int num : seq) { - cout << num << ' '; - } - cout << '\n'; - } - - return 0; -} diff --git "a/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/2477.cpp" "b/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/2477.cpp" deleted file mode 100644 index bc94f29..0000000 --- "a/09_\353\260\261\355\212\270\353\236\230\355\202\271/\355\225\204\354\210\230/2477.cpp" +++ /dev/null @@ -1,54 +0,0 @@ -#include -using namespace std; - -// 참외밭 면적을 계산하는 함수 -int calculate_area(int k, int directions[], int lengths[]) { - int max_width = 0, max_height = 0; // 최대 가로, 세로 길이 - int width_idx = 0, height_idx = 0; // 최대 길이의 인덱스 저장 - - // 가장 긴 가로와 세로 변 찾기 - for (int i = 0; i < 6; i++) { - // 동쪽(1)과 서쪽(2) 방향 (==가로) - if (directions[i] == 1 || directions[i] == 2) { - if (lengths[i] > max_width) { - max_width = lengths[i]; // 최대 가로 길이 갱신 - width_idx = i; // 가로 길이 인덱스 저장 - } - } - // 남쪽(3)과 북쪽(4) 방향 (==세로) - else if (directions[i] == 3 || directions[i] == 4) { - if (lengths[i] > max_height) { - max_height = lengths[i]; // 최대 세로 길이 갱신 - height_idx = i; // 세로 길이 인덱스 저장 - } - } - } - - // 작은 사각형의 너비와 높이 계산 (현재 최대 길이의 대칭 변) - int small_width = lengths[(width_idx + 3) % 6]; // 가로 길이의 대칭 변 - int small_height = lengths[(height_idx + 3) % 6]; // 세로 길이의 대칭 변 - - // (총 면적) = 가장 큰 사각형) - (안의 작은 사각형) - int area = (max_width * max_height) - (small_width * small_height); - - // 최종 참외 개수 계산 - return area * k; // 총 참외 개수 반환 -} - -int main() { - int k; // 1m²당 참외 개수 - cin >> k; - - int directions[6]; // 방향을 저장할 배열 - int lengths[6]; // 길이를 저장할 배열 - - // 방향과 길이 입력 받기 - for (int i = 0; i < 6; i++) { - cin >> directions[i] >> lengths[i]; - } - - // 면적 계산 및 결과 출력 - cout << calculate_area(k, directions, lengths) << "\n"; - - return 0; -} diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/2343.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/2343.cpp" new file mode 100644 index 0000000..36acf16 --- /dev/null +++ "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/2343.cpp" @@ -0,0 +1,59 @@ +#include +#include +#include + +using namespace std; + +// 현재 블루레이 크기로 모든 강의를 M개의 블루레이에 담을 수 있는지 확인하는 함수 +bool can_record(const vector& lectures, int blu_ray_size, int m) { + int count = 1; // 필요한 블루레이 개수 + int current_sum = 0; + + for (int length : lectures) { + if (current_sum + length > blu_ray_size) { + // 현재 블루레이에 담을 수 없으므로 새로운 블루레이 시작 + count++; + current_sum = length; + if (count > m) { + return false; // 블루레이 개수 초과 시 불가능 + } + } else { + current_sum += length; + } + } + + return true; // M개의 블루레이에 담을 수 있음 +} + +int main() { + int n, m; + cin >> n >> m; + + vector lectures(n); + int max_length = 0, total_length = 0; + + for (int i = 0; i < n; ++i) { + cin >> lectures[i]; + max_length = max(max_length, lectures[i]); + total_length += lectures[i]; + } + + // 이분 탐색 범위 설정 + int low = max_length, high = total_length, result = high; + + while (low <= high) { + int mid = (low + high) / 2; + + if (can_record(lectures, mid, m)) { + result = mid; // 가능한 경우, 더 작은 크기를 시도 + high = mid - 1; + } else { + low = mid + 1; // 불가능한 경우, 더 큰 크기를 시도 + } + } + + // 결과 출력 + cout << result << "\n"; + + return 0; +} diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/3079.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/3079.cpp" new file mode 100644 index 0000000..67f86ed --- /dev/null +++ "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/3079.cpp" @@ -0,0 +1,44 @@ +#include +#include +#include + +using namespace std; + +int main() { + long long n, m; + cin >> n >> m; + + vector times(n); + for (int i = 0; i < n; ++i) { + cin >> times[i]; + } + + // 이분 탐색 범위 설정 + long long low = 1; + long long high = *max_element(times.begin(), times.end()) * m; + long long result = high; + + while (low <= high) { + long long mid = (low + high) / 2; + long long people_processed = 0; + + // 각 심사대가 mid 시간 동안 처리할 수 있는 인원 계산 + for (long long time : times) { + people_processed += mid / time; + if (people_processed >= m) break; // 필요한 인원 이상 처리할 수 있으면 종료 + } + + // M명 이상을 처리할 수 있는 경우, 시간 줄이기 시도 + if (people_processed >= m) { + result = mid; + high = mid - 1; + } else { // M명 미만인 경우, 시간을 늘려야 함 + low = mid + 1; + } + } + + // 결과 출력 + cout << result << "\n"; + + return 0; +} diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/10815.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/10815.cpp" new file mode 100644 index 0000000..f6ecbfb --- /dev/null +++ "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/10815.cpp" @@ -0,0 +1,42 @@ +#include +#include + +using namespace std; + +int main() { + ios::sync_with_stdio(false); // 입출력 속도 최적화 + cin.tie(NULL); + + int n, m; + cin >> n; + + unordered_set card_set; + int card; + + // 상근이가 가진 숫자 카드를 입력받아 집합에 저장 + for (int i = 0; i < n; ++i) { + cin >> card; + card_set.insert(card); + } + + cin >> m; + int query; + + // 질의에 대한 결과를 저장할 문자열 + string result; + + // 각 질의에 대해 상근이가 해당 숫자를 가지고 있는지 확인 + for (int i = 0; i < m; ++i) { + cin >> query; + if (card_set.find(query) != card_set.end()) { + result += "1 "; + } else { + result += "0 "; + } + } + + // 결과 출력 + cout << result << "\n"; + + return 0; +} diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/16401.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/16401.cpp" new file mode 100644 index 0000000..16d8ed5 --- /dev/null +++ "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/16401.cpp" @@ -0,0 +1,43 @@ +#include +#include +#include + +using namespace std; + +int main() { + int num_nephews, num_snacks; + cin >> num_nephews >> num_snacks; + + vector snack_lengths(num_snacks); + int max_length = 0; + + for (int i = 0; i < num_snacks; ++i) { + cin >> snack_lengths[i]; + max_length = max(max_length, snack_lengths[i]); + } + + int low = 1, high = max_length, result = 0; + + while (low <= high) { + int mid = (low + high) / 2; + long long total_pieces = 0; + + // 각 과자를 길이 mid로 나누어 얻을 수 있는 조각 수 계산 + for (int length : snack_lengths) { + total_pieces += length / mid; + } + + // 필요한 조각 수와 비교 + if (total_pieces >= num_nephews) { + result = mid; // 가능한 최대 길이 갱신 + low = mid + 1; // 더 긴 길이 시도 + } else { + high = mid - 1; // 더 짧은 길이 시도 + } + } + + // 결과 출력 + cout << result << "\n"; + + return 0; +} diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/17266.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/17266.cpp" new file mode 100644 index 0000000..d0057c4 --- /dev/null +++ "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/17266.cpp" @@ -0,0 +1,38 @@ +#include +#include +#include + +using namespace std; + +int main() { + int tunnel_length, lamp_count; + cin >> tunnel_length >> lamp_count; + + vector lamp_positions(lamp_count); + for (int i = 0; i < lamp_count; ++i) { + cin >> lamp_positions[i]; + } + + // 가로등 위치를 오름차순으로 정렬 + sort(lamp_positions.begin(), lamp_positions.end()); + + // 가로등 간 최대 간격을 찾기 위해 초기화 + int max_gap = 0; + + // 가로등 위치 간의 간격을 계산하여 최대 간격을 찾음 + for (int i = 1; i < lamp_count; ++i) { + max_gap = max(max_gap, lamp_positions[i] - lamp_positions[i - 1]); + } + + // 시작 지점과 첫 번째 가로등, 마지막 가로등과 끝 지점 간의 간격을 고려 + int start_gap = lamp_positions[0] - 0; + int end_gap = tunnel_length - lamp_positions[lamp_count - 1]; + + // 최소 높이는 모든 구간에서 최대 요구되는 높이 중 가장 큰 값 + int min_height = max({(max_gap + 1) / 2, start_gap, end_gap}); + + // 결과 출력 + cout << min_height << "\n"; + + return 0; +} From 7679b9093194aa0eb68b5e03f4541d4d73fa4027 Mon Sep 17 00:00:00 2001 From: Damin Oh <2271086@ewhain.net> Date: Tue, 12 Nov 2024 17:20:16 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[11=EC=9B=94=2012=EC=9D=BC]=20=ED=88=AC?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=84=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\353\217\204\354\240\204/2343.cpp" | 59 ------------ .../\353\217\204\354\240\204/3079.cpp" | 44 --------- .../\355\225\204\354\210\230/10815.cpp" | 42 --------- .../\355\225\204\354\210\230/16401.cpp" | 43 --------- .../\355\225\204\354\210\230/17266.cpp" | 38 -------- .../\353\217\204\354\240\204/20437.cpp" | 64 +++++++++++++ .../\353\217\204\354\240\204/2473.cpp" | 62 +++++++++++++ .../\355\225\204\354\210\230/14503.cpp" | 89 +++++++++++++++++++ .../\355\225\204\354\210\230/20922.cpp" | 45 ++++++++++ .../\355\225\204\354\210\230/2531.cpp" | 57 ++++++++++++ 10 files changed, 317 insertions(+), 226 deletions(-) delete mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/2343.cpp" delete mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/3079.cpp" delete mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/10815.cpp" delete mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/16401.cpp" delete mode 100644 "10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/17266.cpp" create mode 100644 "11_\355\210\254\355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/20437.cpp" create mode 100644 "11_\355\210\254\355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/2473.cpp" create mode 100644 "11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503.cpp" create mode 100644 "11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20922.cpp" create mode 100644 "11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/2531.cpp" diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/2343.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/2343.cpp" deleted file mode 100644 index 36acf16..0000000 --- "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/2343.cpp" +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include -#include - -using namespace std; - -// 현재 블루레이 크기로 모든 강의를 M개의 블루레이에 담을 수 있는지 확인하는 함수 -bool can_record(const vector& lectures, int blu_ray_size, int m) { - int count = 1; // 필요한 블루레이 개수 - int current_sum = 0; - - for (int length : lectures) { - if (current_sum + length > blu_ray_size) { - // 현재 블루레이에 담을 수 없으므로 새로운 블루레이 시작 - count++; - current_sum = length; - if (count > m) { - return false; // 블루레이 개수 초과 시 불가능 - } - } else { - current_sum += length; - } - } - - return true; // M개의 블루레이에 담을 수 있음 -} - -int main() { - int n, m; - cin >> n >> m; - - vector lectures(n); - int max_length = 0, total_length = 0; - - for (int i = 0; i < n; ++i) { - cin >> lectures[i]; - max_length = max(max_length, lectures[i]); - total_length += lectures[i]; - } - - // 이분 탐색 범위 설정 - int low = max_length, high = total_length, result = high; - - while (low <= high) { - int mid = (low + high) / 2; - - if (can_record(lectures, mid, m)) { - result = mid; // 가능한 경우, 더 작은 크기를 시도 - high = mid - 1; - } else { - low = mid + 1; // 불가능한 경우, 더 큰 크기를 시도 - } - } - - // 결과 출력 - cout << result << "\n"; - - return 0; -} diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/3079.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/3079.cpp" deleted file mode 100644 index 67f86ed..0000000 --- "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\353\217\204\354\240\204/3079.cpp" +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -#include - -using namespace std; - -int main() { - long long n, m; - cin >> n >> m; - - vector times(n); - for (int i = 0; i < n; ++i) { - cin >> times[i]; - } - - // 이분 탐색 범위 설정 - long long low = 1; - long long high = *max_element(times.begin(), times.end()) * m; - long long result = high; - - while (low <= high) { - long long mid = (low + high) / 2; - long long people_processed = 0; - - // 각 심사대가 mid 시간 동안 처리할 수 있는 인원 계산 - for (long long time : times) { - people_processed += mid / time; - if (people_processed >= m) break; // 필요한 인원 이상 처리할 수 있으면 종료 - } - - // M명 이상을 처리할 수 있는 경우, 시간 줄이기 시도 - if (people_processed >= m) { - result = mid; - high = mid - 1; - } else { // M명 미만인 경우, 시간을 늘려야 함 - low = mid + 1; - } - } - - // 결과 출력 - cout << result << "\n"; - - return 0; -} diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/10815.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/10815.cpp" deleted file mode 100644 index f6ecbfb..0000000 --- "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/10815.cpp" +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include - -using namespace std; - -int main() { - ios::sync_with_stdio(false); // 입출력 속도 최적화 - cin.tie(NULL); - - int n, m; - cin >> n; - - unordered_set card_set; - int card; - - // 상근이가 가진 숫자 카드를 입력받아 집합에 저장 - for (int i = 0; i < n; ++i) { - cin >> card; - card_set.insert(card); - } - - cin >> m; - int query; - - // 질의에 대한 결과를 저장할 문자열 - string result; - - // 각 질의에 대해 상근이가 해당 숫자를 가지고 있는지 확인 - for (int i = 0; i < m; ++i) { - cin >> query; - if (card_set.find(query) != card_set.end()) { - result += "1 "; - } else { - result += "0 "; - } - } - - // 결과 출력 - cout << result << "\n"; - - return 0; -} diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/16401.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/16401.cpp" deleted file mode 100644 index 16d8ed5..0000000 --- "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/16401.cpp" +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include - -using namespace std; - -int main() { - int num_nephews, num_snacks; - cin >> num_nephews >> num_snacks; - - vector snack_lengths(num_snacks); - int max_length = 0; - - for (int i = 0; i < num_snacks; ++i) { - cin >> snack_lengths[i]; - max_length = max(max_length, snack_lengths[i]); - } - - int low = 1, high = max_length, result = 0; - - while (low <= high) { - int mid = (low + high) / 2; - long long total_pieces = 0; - - // 각 과자를 길이 mid로 나누어 얻을 수 있는 조각 수 계산 - for (int length : snack_lengths) { - total_pieces += length / mid; - } - - // 필요한 조각 수와 비교 - if (total_pieces >= num_nephews) { - result = mid; // 가능한 최대 길이 갱신 - low = mid + 1; // 더 긴 길이 시도 - } else { - high = mid - 1; // 더 짧은 길이 시도 - } - } - - // 결과 출력 - cout << result << "\n"; - - return 0; -} diff --git "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/17266.cpp" "b/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/17266.cpp" deleted file mode 100644 index d0057c4..0000000 --- "a/10_\354\235\264\353\266\204\355\203\220\354\203\211/\355\225\204\354\210\230/17266.cpp" +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include -#include - -using namespace std; - -int main() { - int tunnel_length, lamp_count; - cin >> tunnel_length >> lamp_count; - - vector lamp_positions(lamp_count); - for (int i = 0; i < lamp_count; ++i) { - cin >> lamp_positions[i]; - } - - // 가로등 위치를 오름차순으로 정렬 - sort(lamp_positions.begin(), lamp_positions.end()); - - // 가로등 간 최대 간격을 찾기 위해 초기화 - int max_gap = 0; - - // 가로등 위치 간의 간격을 계산하여 최대 간격을 찾음 - for (int i = 1; i < lamp_count; ++i) { - max_gap = max(max_gap, lamp_positions[i] - lamp_positions[i - 1]); - } - - // 시작 지점과 첫 번째 가로등, 마지막 가로등과 끝 지점 간의 간격을 고려 - int start_gap = lamp_positions[0] - 0; - int end_gap = tunnel_length - lamp_positions[lamp_count - 1]; - - // 최소 높이는 모든 구간에서 최대 요구되는 높이 중 가장 큰 값 - int min_height = max({(max_gap + 1) / 2, start_gap, end_gap}); - - // 결과 출력 - cout << min_height << "\n"; - - return 0; -} diff --git "a/11_\355\210\254\355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/20437.cpp" "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/20437.cpp" new file mode 100644 index 0000000..f9b3e3c --- /dev/null +++ "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/20437.cpp" @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include + +using namespace std; + +pair findMinMaxLengths(const string& w, int k) { + int min_length = INT_MAX; + int max_length = -1; + + // 각 문자의 위치를 저장 + vector> char_positions(26); + + // 각 문자의 위치를 char_positions에 저장 + for (int i = 0; i < w.size(); i++) { + char_positions[w[i] - 'a'].push_back(i); + } + + // 각 문자별 위치 리스트에서 K개씩 연속한 위치 간의 거리 계산 + for (int i = 0; i < 26; i++) { + if (char_positions[i].size() < k) continue; // 해당 문자가 K번 미만 등장 시 건너뜀 + + // 해당 문자의 위치에서 K개 연속 부분 문자열의 길이 계산 + for (int j = 0; j <= char_positions[i].size() - k; j++) { + int length = char_positions[i][j + k - 1] - char_positions[i][j] + 1; + + min_length = min(min_length, length); + max_length = max(max_length, length); + } + } + + // 가능한 문자열이 없을 경우 -1 반환 + if (min_length == INT_MAX) min_length = -1; + if (max_length == -1) max_length = -1; + + return {min_length, max_length}; +} + +int main() { + ios_base::sync_with_stdio(false); + cin.tie(NULL); + + int t; + cin >> t; + + while (t--) { + string w; + int k; + cin >> w >> k; + + pair result = findMinMaxLengths(w, k); + + // 둘 다 -1일 경우 단일 -1만 출력 + if (result.first == -1 && result.second == -1) { + cout << -1 << '\n'; + } else { + cout << result.first << " " << result.second << '\n'; + } + } + + return 0; +} diff --git "a/11_\355\210\254\355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/2473.cpp" "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/2473.cpp" new file mode 100644 index 0000000..24da0d9 --- /dev/null +++ "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\353\217\204\354\240\204/2473.cpp" @@ -0,0 +1,62 @@ +#include +#include +#include +#include // math.h 대신 cmath 사용 + +using namespace std; + +vector findClosestToZero(const vector& arr, int num) { + long long result = 3000000001; // 초기값 설정 (0에 가까운 값을 찾기 위해) + vector ans(3); // 결과를 저장할 벡터 + + // 배열을 오름차순으로 정렬 + vector sorted_arr = arr; + sort(sorted_arr.begin(), sorted_arr.end()); + + // 첫 번째 포인터(k)를 고정하고, 두 번째 포인터(l)와 세 번째 포인터(r)를 사용해 탐색 + for (int k = 0; k < num - 2; k++) { + int l = k + 1; + int r = num - 1; + + while (l < r) { + long long val = sorted_arr[k] + sorted_arr[l] + sorted_arr[r]; + + // 절대값을 비교하여 0에 더 가까운 값을 찾으면 결과 갱신 + if (abs(val) < result) { + result = abs(val); + ans[0] = sorted_arr[k]; + ans[1] = sorted_arr[l]; + ans[2] = sorted_arr[r]; + } + + // 합이 0 미만: 왼쪽 포인터 이동 + if (val < 0) { + l++; + } + // 합이 0 이상: 오른쪽 포인터 이동 + else { + r--; + } + } + } + + return ans; // 최종 결과 반환 +} + +int main() { + + int num; + cin >> num; + + vector arr(num); + for (int i = 0; i < num; i++) + cin >> arr[i]; + + // findClosestToZero 함수를 호출 + vector result = findClosestToZero(arr, num); + + // 오름차순 정렬된 결과만 출력 + cout << result[0] << " " << result[1] << " " << result[2] << '\n'; + + return 0; +} diff --git "a/11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503.cpp" "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503.cpp" new file mode 100644 index 0000000..40c1017 --- /dev/null +++ "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/14503.cpp" @@ -0,0 +1,89 @@ +#include +#include + +using namespace std; + +int n, m; // 방의 크기 N x M +int r, c, d; + +vector> room; // 방의 상태를 나타내는 2차원 벡터 +vector> cleaned; // 청소 여부를 표시하는 2차원 벡터 + +// 북, 동, 남, 서 방향에 대한 행/열 이동값 설정 +const int DR[4] = {-1, 0, 1, 0}; // 방향에 따른 행 이동 +const int DC[4] = {0, 1, 0, -1}; // 방향에 따른 열 이동 + +// 방향을 반시계 방향으로 회전시키는 함수 +int rotateLeft(int direction) { + return (direction + 3) % 4; // 왼쪽으로 90도 회전 +} + +// 현재 방향에서 후진할 위치를 계산하는 함수 +pair moveBackward(int row, int col, int direction) { + int back_dir = (direction + 2) % 4; // 현재 방향에서 뒤쪽 방향 계산 + return {row + DR[back_dir], col + DC[back_dir]}; // 후진 위치 반환 +} + +// 방을 청소하고, 청소한 칸의 개수를 반환하는 함수 +int cleanRoom() { + int cleaned_count = 0; // 청소한 칸의 개수를 저장할 변수 + + while (true) { + // 1. 현재 위치를 청소 + if (!cleaned[r][c]) { // 현재 칸이 청소되지 않았으면 + cleaned[r][c] = true; // 청소 상태로 변경 + cleaned_count++; // 청소한 칸 개수 증가 + } + + bool found_cleanable = false; // 청소 가능한 칸을 찾았는지 여부 + + // 2. 주변 4칸을 확인하며 청소할 칸을 탐색 + for (int i = 0; i < 4; i++) { + d = rotateLeft(d); + int new_row = r + DR[d]; + int new_col = c + DC[d]; + + // 청소되지 않은 빈 칸이 있는 경우 이동 + if (new_row >= 0 && new_row < n && new_col >= 0 && new_col < m && !cleaned[new_row][new_col] && room[new_row][new_col] == 0) { + r = new_row; // 청소 가능한 위치로 이동 + c = new_col; + found_cleanable = true; + break; // 청소 가능한 칸을 찾았으므로 4방향 탐색 종료 + } + } + + // 3. 주변에 청소할 빈 칸이 없는 경우 + if (!found_cleanable) { + auto [back_row, back_col] = moveBackward(r, c, d); + if (room[back_row][back_col] == 1) { // 후진하려는 위치가 벽인 경우 + break; + } + r = back_row; // 후진 가능하면 후진 + c = back_col; + } + } + return cleaned_count; // 청소한 칸의 개수 반환 +} + +int main() { + ios::sync_with_stdio(false); + cin.tie(NULL); + + // 방의 크기를 입력 받는다. + cin >> n >> m; + // 처음에 로봇 청소기가 있는 칸의 좌표 (r,c), 방향 d + cin >> r >> c >> d; + + room.resize(n, vector(m)); // 방 상태를 저장할 벡터 크기 설정 + cleaned.resize(n, vector(m, false)); // 청소 여부를 저장할 벡터 설정 + + // 방의 상태 입력 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> room[i][j]; + } + } + + cout << cleanRoom() << '\n'; // 청소한 칸의 개수 출력 + return 0; +} diff --git "a/11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20922.cpp" "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20922.cpp" new file mode 100644 index 0000000..8d26b5d --- /dev/null +++ "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/20922.cpp" @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +using namespace std; + +int findLongestSubarray(const vector& sequence, int n, int k) { + unordered_map count_map; // 각 원소의 등장 횟수를 저장하는 해시 맵 + int left = 0, max_length = 0; // 투 포인터의 왼쪽(left)과 최대 길이(max_length) + + // 오른쪽 포인터를 이동하면서 조건을 만족하는 부분 수열의 길이 계산 + for (int right = 0; right < n; right++) { + int num = sequence[right]; + count_map[num]++; // 현재 원소의 등장 횟수 증가 + + // 현재 원소가 K번 초과로 등장할 경우 왼쪽 포인터 이동 + while (count_map[num] > k) { + count_map[sequence[left]]--; // 왼쪽 포인터가 가리키는 원소의 등장 횟수 감소 + left++; // 왼쪽 포인터 오른쪽으로 이동 + } + + // 조건을 만족하는 부분 수열의 길이 갱신 + max_length = max(max_length, right - left + 1); + } + + return max_length; +} + +int main() { + ios::sync_with_stdio(false); + cin.tie(NULL); + + int n, k; + cin >> n >> k; + + vector sequence(n); + for (int i = 0; i < n; i++) { + cin >> sequence[i]; + } + + cout << findLongestSubarray(sequence, n, k) << '\n'; + + return 0; +} diff --git "a/11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/2531.cpp" "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/2531.cpp" new file mode 100644 index 0000000..a9aedf1 --- /dev/null +++ "b/11_\355\210\254\355\217\254\354\235\270\355\204\260/\355\225\204\354\210\230/2531.cpp" @@ -0,0 +1,57 @@ +#include +#include +#include +#include + +using namespace std; + +int calcMaxSushi(const vector& belt, int n, int d, int k, int c) { + unordered_map sushi_count; // 각 초밥의 등장 횟수를 저장하는 해시 맵 + int distinct_sushi = 0, max_sushi = 0; + + // 초기 k개의 초밥에 대해 처리 + for (int i = 0; i < k; i++) { + if (sushi_count[belt[i]] == 0) distinct_sushi++; + sushi_count[belt[i]]++; + } + + max_sushi = distinct_sushi; + if (sushi_count[c] == 0) max_sushi++; // 쿠폰 초밥 추가 + + // 슬라이딩 윈도우로 나머지 경우 탐색 + for (int i = 1; i < n; i++) { + int remove_idx = i - 1; + int add_idx = (i + k - 1) % n; + + // 이전 초밥 제거 + if (--sushi_count[belt[remove_idx]] == 0) distinct_sushi--; + + // 새 초밥 추가 + if (sushi_count[belt[add_idx]]++ == 0) distinct_sushi++; + + int current_max = distinct_sushi; + + if (sushi_count[c] == 0) current_max++; // 쿠폰 초밥 추가 + + max_sushi = max(max_sushi, current_max); + } + + return max_sushi; +} + +int main() { + ios::sync_with_stdio(false); + cin.tie(NULL); + + // 회전 초밥 벨트에 놓인 접시의 수 n, 초밥 가짓수 d, 연속해서 먹는 접시 수 k, 쿠폰 번호 c + int n, d, k, c; + cin >> n >> d >> k >> c; + + vector belt(n); + for (int i = 0; i < n; i++) { + cin >> belt[i]; + } + + cout << calcMaxSushi(belt, n, d, k, c) << '\n'; + return 0; +}