Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[최단경로] 2176255 이서연 #347

Open
wants to merge 30 commits into
base: 2176255-이서연
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
cedeb06
[5월 9일] 이분 탐색 과제 코드 업로드
jk0527 May 9, 2023
7699152
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 9, 2023
bbfbc93
[5월 9일] 투 포인터 리드미 업로드
jk0527 May 9, 2023
7baa1de
[5월 10일] 이분 탐색 리드미 수정
jk0527 May 10, 2023
b6f7843
[5월 10일] 투 포인터 강의 자료 업로드
jk0527 May 10, 2023
b92e936
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 10, 2023
56d70ae
[5월 10일] 리드미 수정
jk0527 May 10, 2023
ae608f8
[5월 12일] 투 포인터 라이브 코딩 코드 업로드
jk0527 May 12, 2023
725af3e
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 12, 2023
6846e9e
[5월 12일] 투 포인터 라이브 코딩 코드 업로드
jk0527 May 12, 2023
157d1fc
[5월 12일] 투 포인터 리드미 수정
jk0527 May 12, 2023
077bd1b
[5월 16일] 투 포인터 과제 코드 업로드
jk0527 May 16, 2023
b48257f
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 16, 2023
198416c
[5월 16일] 투 포인터 리드미 수정
jk0527 May 16, 2023
5536b51
[5월 16일] 트리 강의 자료 업로드
jk0527 May 16, 2023
9bf8964
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 16, 2023
cd29d82
[5월 16일] 트리 리드미 업로드
jk0527 May 16, 2023
f5fd534
[5월 16일] 리드미 수정
jk0527 May 16, 2023
5c5694a
[5월 19일] 트리 라이브 코딩 코드 업로드
jk0527 May 19, 2023
cf31227
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 19, 2023
a8cc122
[5월 19일] 트리 리드미 수정
jk0527 May 19, 2023
5ab3590
[5월 23일] 트리 과제 코드 업로드
jk0527 May 23, 2023
20be664
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 23, 2023
dad8d2c
[5월 23일] 트리 리드미 수정
jk0527 May 23, 2023
1373cde
[5월 23일] 최단 경로 강의 자료 업로드
jk0527 May 23, 2023
6d1de48
Merge branch 'main' of https://github.com/Altu-Bitu-Official/Altu-Bitu-4
jk0527 May 23, 2023
b57dc56
[5월 23일] 최단 경로 리드미 업로드
jk0527 May 23, 2023
c908c33
[5월 23일] 리드미 수정
jk0527 May 23, 2023
6e6196b
[최단경로] 0528
SeoYeomm May 28, 2023
6c77bdc
[최단경로] 0531 - 추가제출
SeoYeomm May 31, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions 10_이분 탐색/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,16 @@

| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
| :-----------------------------------------------------------------------: | :------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :-------: | :------------------------: |
| <a href="https://www.acmicpc.net/problem/14500" target="_blank">14500</a> | <a href="https://www.acmicpc.net/problem/14500" target="_blank">테트로미노</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/12.svg"/> | [C++]() | 구현, 브루트 포스 |
| <a href="https://www.acmicpc.net/problem/10815" target="_blank">10815</a> | <a href="https://www.acmicpc.net/problem/10815" target="_blank">숫자 카드</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/6.svg"/> | [C++]() | 자료구조, 정렬, 이분 탐색 |
| <a href="https://www.acmicpc.net/problem/16401" target="_blank">16401</a> | <a href="https://www.acmicpc.net/problem/16401" target="_blank">과자 나눠주기</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/9.svg"/> | [C++]() | 이분 탐색, 매개 변수 탐색 |
| <a href="https://www.acmicpc.net/problem/14500" target="_blank">14500</a> | <a href="https://www.acmicpc.net/problem/14500" target="_blank">테트로미노</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/12.svg"/> | [C++](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/10_%EC%9D%B4%EB%B6%84%20%ED%83%90%EC%83%89/%ED%95%84%EC%88%98/14500.cpp) | 구현, 브루트 포스 |
| <a href="https://www.acmicpc.net/problem/10815" target="_blank">10815</a> | <a href="https://www.acmicpc.net/problem/10815" target="_blank">숫자 카드</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/6.svg"/> | [C++](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/10_%EC%9D%B4%EB%B6%84%20%ED%83%90%EC%83%89/%ED%95%84%EC%88%98/10815.cpp) | 자료구조, 정렬, 이분 탐색 |
| <a href="https://www.acmicpc.net/problem/16401" target="_blank">16401</a> | <a href="https://www.acmicpc.net/problem/16401" target="_blank">과자 나눠주기</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/9.svg"/> | [C++](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/10_%EC%9D%B4%EB%B6%84%20%ED%83%90%EC%83%89/%ED%95%84%EC%88%98/16401.cpp) | 이분 탐색, 매개 변수 탐색 |

### 도전

| 문제 번호 | 문제 이름 | 난이도 | 풀이 링크 | 분류 |
| :--------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | :-------: | :--: |
| <a href="https://www.acmicpc.net/problem/2343" target="_blank">2343</a> | <a href="https://www.acmicpc.net/problem/2343" target="_blank">기타 레슨</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/10.svg"/> | [C++]() | 이분 탐색, 매개 변수 탐색 |
| <a href="https://www.acmicpc.net/problem/3079" target="_blank">3079</a> | <a href="https://www.acmicpc.net/problem/3079" target="_blank">입국심사</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/11.svg"/> | [C++]() | 이분 탐색, 매개 변수 탐색 |
| <a href="https://www.acmicpc.net/problem/2343" target="_blank">2343</a> | <a href="https://www.acmicpc.net/problem/2343" target="_blank">기타 레슨</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/10.svg"/> | [C++](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/10_%EC%9D%B4%EB%B6%84%20%ED%83%90%EC%83%89/%EB%8F%84%EC%A0%84/2343.cpp) | 이분 탐색, 매개 변수 탐색 |
| <a href="https://www.acmicpc.net/problem/3079" target="_blank">3079</a> | <a href="https://www.acmicpc.net/problem/3079" target="_blank">입국심사</a> | <img height="25px" width="25px" src="https://static.solved.ac/tier_small/11.svg"/> | [C++](https://github.com/Altu-Bitu-Official/Altu-Bitu-4/blob/main/10_%EC%9D%B4%EB%B6%84%20%ED%83%90%EC%83%89/%EB%8F%84%EC%A0%84/3079.cpp) | 이분 탐색, 매개 변수 탐색 |

---

Expand Down
50 changes: 50 additions & 0 deletions 10_이분 탐색/도전/2343.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

/*
* 적절한 블루레이의 크기를 매개변수 탐색을 이용해 찾습니다.
* 이 때, 각 블루레이의 크기는 최대 강의 길이(maxLen) 이상, 강의 길이의 합(sumLen) 이하임을 이용합니다.
*/

int findSize(int&left, int right, vector<int> lesson, int n, int m) {
// 적절한 블루레이의 크기를 이진탐색을 이용해 찾기
while (left <= right) {
int mid = (left + right) / 2; // mid(찾는 값): 블루레이 크기 후보
int count = 0; // 블루레이의 개수
int sum_blue = 0; // 각 블루레이의 크기

for (int i = 0; i < n; i++) {
if (sum_blue + lesson[i] > mid) {
count++;
sum_blue = 0;
}
sum_blue += lesson[i];
}
count++;
// 사이즈가 mid일 때의 블루레이 개수가 m보다 작거나 같으면 더 작은 사이즈로 가정하고 탐색
// 반대의 경우, 더 큰 값으로 가정하고 대해 탐색
(count <= m) ? right = mid - 1 : left = mid + 1;
}
return left;
}

int main() {
int n, m, sum_len = 0, max_len = 0;
// 강의의 수, 블루레이의 수 입력
cin >> n >> m;

// 강의 동영상 길이 입력받을 벡터
vector<int> lesson(n);
// 강의 동영상의 길이 입력
for (int i = 0; i < n; i++) {
cin >> lesson[i];
sum_len += lesson[i]; // 강의 길이의 합 갱신
max_len = max(lesson[i], max_len); // 강의 길이의 최댓값 갱신
}
// 연산 & 출력
cout << findSize(max_len, sum_len, lesson, n, m);
return 0;
}
64 changes: 64 additions & 0 deletions 10_이분 탐색/도전/3079.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long ll;
const int MAX = 1e5;

/*
* 매개변수 탐색을 이용하여 입국 심사에 걸리는 시간을 계산합니다.
* 각 입국 심사에 걸리는 시간에 따라 심사가능한 인원을 계산한 후, 일행 인원과 비교해가며 진행합니다.
*/

ll paramSearch(ll &m, ll &n, vector<ll>& times, ll &max_wait) {
// 최소 시간: 0, 최대 대기 시간: 최대 단일 대기시간*m
ll left = 0, right = max_wait*m;
// 대기 시간의 최댓값으로 설정 후 값을 줄여갑니다
ll result = right;

while (left <= right) {
ll mid = (left + right) / 2;
ll sum = 0; // mid만큼 기다릴 때, 입국심사 가능한 인원
for (int i = 0; i < n; i++) {
sum += mid / times[i];
if (sum > m){
break;
}
}
// 입국심사 가능한 인원이 일행 수보다 크거나 같은 경우 -> 더 적게 기다릴 수도 있음
if (sum >= m) {
result = min(result, mid);
right = mid - 1;
}
// 입국심사 가능한 인원이 일행 수보다 작은 경우 -> 더 오래 기다려야 함
else {
left = mid + 1;
}
}
return result;
}

int main(void) {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);

ll n, m;
ll max_wait = -1;
vector<ll> times(MAX+1);

// 입력
cin >> n >> m;

// 입국심사에 걸리는 시간 입력
for (int i = 0; i < n; i++) {
cin >> times[i];
max_wait = max(max_wait, times[i]);
}
sort(times.begin(), times.begin()+n);

// 연산 & 출력
cout << paramSearch(m, n, times, max_wait);
return 0;
}
Empty file.
46 changes: 46 additions & 0 deletions 10_이분 탐색/필수/10815.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#include <iostream>
#include <vector>
#include<algorithm>

using namespace std;

/*
* 카드의 존재 여부만 판단하면 되므로, 이분 탐색을 이용해 해당 카드의 인덱스를 찾습니다.
*/

int binarySearch(int num, vector<int>& card, int n) {
//카드 인덱스의 최소값: 0, 최대값: n
int left = 0; int right = n;
while (left <= right) {
int mid = (left + right) / 2;
if (num == card[mid]) {
return 1;
}
if (num > card[mid]) {
left = mid + 1;
}
else right = mid - 1;
}
return 0;
}


int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
// 입력
int n, m, num;
cin >> n;
vector<int> card(n);
for (int i = 0; i < n; i++) {
cin >> card[i];
}
sort(card.begin(), card.end()); // 이분 탐색을 위해 정렬

cin >> m;
while (m--) {
cin >> num;
// 연산 & 출력
cout << binarySearch(num, card, n) << ' ';
}
}
85 changes: 85 additions & 0 deletions 10_이분 탐색/필수/14500.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#include<iostream>
#include<vector>
#include <algorithm>

using namespace std;

vector<vector<int>>board;

int ans;

void dfs(int x, int y, int depth, int sum) {

vector<int> dx = { -1,0,1,0 };
vector<int> dy = { 0,1,0,-1 };

if (depth == 4) { // 칸 4개 선택했으면 ans 최대값 갱신
ans = max(ans, sum);
return;
}

// 아래 코드가 들어가면 가지치기가 돼 백트래킹이 돼요!
//if (ans >= MAX * (4 - cnt) + 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;
}

int temp = board[nx][ny]; // 방문 처리하기 전 해당 칸 가치 저장
board[nx][ny] = 0; // 방문 처리 : 4개를 선택함에 있어서 똑같은 블록을 선택하지 않기 위해

// 다음 탐색 -> depth 1 증가 && sum값에 현재 칸 가치 더하기
if (depth == 2) { // ㅜ 모양은 현재 위치에서 다시 탐색!
dfs(x, y, depth + 1, sum + temp);
}
dfs(nx, ny, depth + 1, sum + temp); // 선택한 칸으로 이동

board[nx][ny] = temp; // 이후의 케이스에서 재방문할 수 있으므로 원래대로 돌려줌

}
}

/*
* HINT : 하나의 도형은 무언가 특별한 것 같아요! or 테트로미노의 모양은 탐색의 관점에서 특징이 있는 것 같아요!
* 1. ㅜ 모양을 제외한 테트로미노의 모양은 깊이가 4인 dfs의 탐색 모양
* -> dfs로 블록을 하나씩 선택해가면서 개수(cnt)와 합(sum)을 계산
* -> 4개 선택하면 최댓값 갱신
* 2. 예외 : ㅜ 모양은 블록을 2개 선택했을 때 현재 블록에서 다시 블록을 선택해준다.
*/


int main() {

// 입력
int n, m;
cin >> n >> m;
board.assign(n, vector<int>(m, 0));


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);
board[i][j] = temp;
}
}

// 출력
cout << ans;
return 0;
}
47 changes: 47 additions & 0 deletions 10_이분 탐색/필수/16401.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include <iostream>
#include <vector>

using namespace std;

/*
* 이분 탐색을 이용하여 나눠줄 수 있는 최대한 긴 과자의 길이를 찾아낸다.
*/

#define MAX_COOKIE 1000000000

int binarySearch(int m, vector<int> &cookie) {
int right = MAX_COOKIE; // 과자의 최대 길이: 1000000000
int left = 1; // 과자의 최소 길이: 1
int res=0;

while (left <= right) {
int mid = (left + right) / 2;
int cnt = 0;
// mid 길이만큼씩 나눠주면 몇 명에게 나눠줄 수 있는지 세기
for (int i = 0; i < cookie.size(); i++) {
cnt += cookie[i] / mid;
}
if (cnt >= m) {
left = mid + 1;
res = mid;
}
else{
right = mid - 1;
}
}
return res;
}

int main() {
int m, n;
// 조카 수, 과자 수 입력
cin >> m >> n;
vector<int> cookie(n);
// 막대과자 길이 입력
for (int i = 0; i < n; i++) {
cin >> cookie[i];
}
// 연산 & 출력
cout << binarySearch(m, cookie);
return 0;
}
Empty file.
Loading