diff --git "a/9-kyo-hwang/Binary Search/13397 \352\265\254\352\260\204 \353\202\230\353\210\204\352\270\260 2.cpp" "b/9-kyo-hwang/Binary Search/13397 \352\265\254\352\260\204 \353\202\230\353\210\204\352\270\260 2.cpp" new file mode 100644 index 0000000..8362fee --- /dev/null +++ "b/9-kyo-hwang/Binary Search/13397 \352\265\254\352\260\204 \353\202\230\353\210\204\352\270\260 2.cpp" @@ -0,0 +1,59 @@ +#include +#include +#include + +using namespace std; + +int main() +{ + cin.tie(nullptr)->sync_with_stdio(false); + + int N, M; cin >> N >> M; + + vector Nums(N); + for(int& Num : Nums) + { + cin >> Num; + } + + auto IsValid = [&](int EstimateScore) + { + int Count = 1; + int Min = Nums[0], Max = Nums[0]; + + for(int i = 1; i < N; ++i) + { + Min = min(Min, Nums[i]); + Max = max(Max, Nums[i]); + + if(Max - Min > EstimateScore) + { + Count++; + Min = Nums[i]; + Max = Nums[i]; + } + } + + return Count <= M; + }; + + int Min = 0, Max = *max_element(Nums.begin(), Nums.end()); + int Score = Max; + while(Min <= Max) + { + int EstimateScore = (Min + Max) / 2; + if(IsValid(EstimateScore)) + { + Score = min(Score, EstimateScore); + Max = EstimateScore - 1; + } + else + { + Min = EstimateScore + 1; + } + } + + cout << Score; + + return 0; +} \ No newline at end of file diff --git "a/9-kyo-hwang/Binary Search/\354\247\225\352\262\200\353\213\244\353\246\254.cpp" "b/9-kyo-hwang/Binary Search/\354\247\225\352\262\200\353\213\244\353\246\254.cpp" new file mode 100644 index 0000000..c53000d --- /dev/null +++ "b/9-kyo-hwang/Binary Search/\354\247\225\352\262\200\353\213\244\353\246\254.cpp" @@ -0,0 +1,49 @@ +#include +#include +#include + +using namespace std; + +int solution(int InDistance, vector InRocks, int NumRemove) +{ + InRocks.emplace_back(InDistance); + sort(InRocks.begin(), InRocks.end()); + + int LowerDistance = 1, UpperDistance = InDistance; + int Answer = 0; + + auto IsValid = [&](int EstimateDistance) + { + int Count = 0, CurrentPos = 0; + for(int RockPos : InRocks) + { + int Distance = RockPos - CurrentPos; + if(Distance >= EstimateDistance) + { + CurrentPos = RockPos; + } + else + { + Count++; + } + } + + return Count <= NumRemove; + }; + + while(LowerDistance <= UpperDistance) + { + int EstimateDistance = (LowerDistance + UpperDistance) / 2; + if(IsValid(EstimateDistance)) + { + Answer = EstimateDistance; + LowerDistance = EstimateDistance + 1; + } + else + { + UpperDistance = EstimateDistance - 1; + } + } + + return Answer; +} \ No newline at end of file diff --git "a/9-kyo-hwang/Graph Traversal/\355\215\274\354\246\220 \354\241\260\352\260\201 \354\261\204\354\232\260\352\270\260.cpp" "b/9-kyo-hwang/Graph Traversal/\355\215\274\354\246\220 \354\241\260\352\260\201 \354\261\204\354\232\260\352\270\260.cpp" new file mode 100644 index 0000000..d2a864a --- /dev/null +++ "b/9-kyo-hwang/Graph Traversal/\355\215\274\354\246\220 \354\241\260\352\260\201 \354\261\204\354\232\260\352\270\260.cpp" @@ -0,0 +1,125 @@ +#include +#include +#include +#include + +using namespace std; +using FPoint = pair; + +vector> GetBlocksFrom(vector>& Board, bool IsBoard = true) +{ + const vector Offset{{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; + auto OutOfBound = [&](int x, int y) + { + return x < 0 || x >= Board.size() || y < 0 || y >= Board.size(); + }; + + vector> Blocks; + + function DFS = [&](int x, int y) + { + Blocks.back().emplace_back(x, y); + Board[x][y] = (IsBoard ? 1 : 0); + + for(const auto& [dx, dy] : Offset) + { + int nx = x + dx, ny = y + dy; + if(!OutOfBound(nx, ny) && Board[nx][ny] == (IsBoard ? 0 : 1)) + { + DFS(nx, ny); + } + } + }; + + for(int i = 0; i < Board.size(); ++i) + { + for(int j = 0; j < Board.size(); ++j) + { + if(IsBoard && Board[i][j] == 0 + || !IsBoard && Board[i][j] == 1) + { + Blocks.push_back({}); + DFS(i, j); + } + } + } + + return Blocks; +} + +vector> GetGridFrom(const vector& Block) +{ + auto [MinX, MinY] = Block[0]; + auto [MaxX, MaxY] = Block[0]; + + for(const auto& [x, y] : Block) + { + if(x < MinX) MinX = x; + else if(x > MaxX) MaxX = x; + + if(y < MinY) MinY = y; + else if(y > MaxY) MaxY = y; + } + + vector> Grid(MaxX - MinX + 1, vector(MaxY - MinY + 1, 0)); + for(const auto& [x, y] : Block) + { + Grid[x - MinX][y - MinY] = 1; + } + + return Grid; +} + +int Rotate(vector>& Grid) +{ + vector> Rotated(Grid[0].size(), vector(Grid.size(), 0)); + int NumCell = 0; + + for(int i = 0; i < Grid.size(); ++i) + { + for(int j = 0; j < Grid[0].size(); ++j) + { + if(Grid[i][j] == 1) NumCell++; + Rotated[j][Grid.size() - 1 - i] = Grid[i][j]; + } + } + + Grid = Rotated; + return NumCell; +} + +int solution(vector> InGameBoard, vector> InTable) +{ + vector> BoardBlocks = GetBlocksFrom(InGameBoard, true); + vector> TableBlocks = GetBlocksFrom(InTable, false); + + set> UsedTableBlocks; + int Answer = 0; + + for(const vector& BoardBlock : BoardBlocks) + { + bool IsFilled = false; + vector> BoardBlockGrid = GetGridFrom(BoardBlock); + + for(const vector& TableBlock : TableBlocks) + { + if(IsFilled) break; + if(UsedTableBlocks.count(TableBlock)) continue; + + vector> TableBlockGrid = GetGridFrom(TableBlock); + for(int i = 0; i < 4; ++i) + { + int NumCell = Rotate(TableBlockGrid); + if(BoardBlockGrid == TableBlockGrid) + { + Answer += NumCell; + UsedTableBlocks.emplace(TableBlock); + IsFilled = true; + break; + } + } + } + } + + return Answer; +} \ No newline at end of file diff --git "a/9-kyo-hwang/Greedy/\353\224\224\355\216\234\354\212\244 \352\262\214\354\236\204.cpp" "b/9-kyo-hwang/Greedy/\353\224\224\355\216\234\354\212\244 \352\262\214\354\236\204.cpp" new file mode 100644 index 0000000..256384e --- /dev/null +++ "b/9-kyo-hwang/Greedy/\353\224\224\355\216\234\354\212\244 \352\262\214\354\236\204.cpp" @@ -0,0 +1,33 @@ +#include +#include +#include + +using namespace std; + +int solution(int N, int K, vector InEnemies) +{ + priority_queue NumofEnemiesBlocked; + int Round = 0; + + for(int Enemy : InEnemies) + { + N -= Enemy; + NumofEnemiesBlocked.emplace(Enemy); + + if(N < 0) + { + if(K == 0) + { + break; + } + + N += NumofEnemiesBlocked.top(); + NumofEnemiesBlocked.pop(); + K--; + } + + Round++; + } + + return Round; +} diff --git a/9-kyo-hwang/README.md b/9-kyo-hwang/README.md index 8ed2789..fa7a2c5 100644 --- a/9-kyo-hwang/README.md +++ b/9-kyo-hwang/README.md @@ -62,4 +62,9 @@ | 59차시 | 2024.8.01 | Greedy | [마법의 엘리베이터](https://school.programmers.co.kr/learn/courses/30/lessons/148653) | [#210](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/210) | | 60차시 | 2024.8.05 | Implementation | [과제 진행하기](https://school.programmers.co.kr/learn/courses/30/lessons/176962) | [#213](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/213) | | 61차시 | 2024.8.08 | Implementation | [테이블 해시 함수](https://school.programmers.co.kr/learn/courses/30/lessons/147354) | [#214](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/214) | -| 62차시 | 2024.8.12 | Graph Traversal | [무인도 여행](https://school.programmers.co.kr/learn/courses/30/lessons/154540) | [#217](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/217) | \ No newline at end of file +| 62차시 | 2024.8.12 | Graph Traversal | [무인도 여행](https://school.programmers.co.kr/learn/courses/30/lessons/154540) | [#217](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/217) | +| 63차시 | 2024.9.3 | Binary Search | [구간 나누기2](https://www.acmicpc.net/problem/13397) | [#218](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/218) | +| 64차시 | 2024.9.8 | Binary Search | [징검다리](https://school.programmers.co.kr/learn/courses/30/lessons/43236) | [#221](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/221) | +| 65차시 | 2024.9.11 | Greedy | [디펜스 게임](https://school.programmers.co.kr/learn/courses/30/lessons/142085) | [#224](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/224) | +| 66차시 | 2024.9.14 | Sliding Window | [할인 행사](https://school.programmers.co.kr/learn/courses/30/lessons/131127) | [#225](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/225) | +| 67차시 | 2024.9.23 | Graph Traversal | [할인 행사](https://school.programmers.co.kr/learn/courses/30/lessons/84021) | [#228](https://github.com/AlgoLeadMe/AlgoLeadMe-3/pull/228) | \ No newline at end of file diff --git "a/9-kyo-hwang/Sliding Window/\355\225\240\354\235\270 \355\226\211\354\202\254.cpp" "b/9-kyo-hwang/Sliding Window/\355\225\240\354\235\270 \355\226\211\354\202\254.cpp" new file mode 100644 index 0000000..aa50591 --- /dev/null +++ "b/9-kyo-hwang/Sliding Window/\355\225\240\354\235\270 \355\226\211\354\202\254.cpp" @@ -0,0 +1,35 @@ +#include +#include +#include + +using namespace std; + +int solution(vector InWants, vector InNumbers, vector InDiscounts) +{ + unordered_map NumberbyWants; + for(int i = 0; i < 9; ++i) + { + NumberbyWants[InDiscounts[i]]++; + } + + int Answer = 0; + for(int i = 9; i < InDiscounts.size(); ++i) + { + NumberbyWants[InDiscounts[i]]++; + bool Flag = true; + + for(int j = 0; j < InWants.size(); ++j) + { + if(NumberbyWants[InWants[j]] != InNumbers[j]) + { + Flag = false; + break; + } + } + + Answer += Flag; + NumberbyWants[InDiscounts[i - 9]]--; + } + + return Answer; +} \ No newline at end of file