More actions
No edit summary |
(Repair pages found by live-compare batch 0001) |
||
| Line 6: | Line 6: | ||
= 참가자 = | = 참가자 = | ||
* [[15이원준]], | * [[15이원준]], 박인서, 곽정흠 | ||
= 코드(DFS와 BFS) = | = 코드(DFS와 BFS) = | ||
| Line 17: | Line 17: | ||
void DFS(int now); | void DFS(int now); | ||
int arr | int arr[1010][1010] = { 0, }; | ||
int visit | int visit[1010] = { 0, }; | ||
int N, M, V; | int N, M, V; | ||
int visitNum = 0; | int visitNum = 0; | ||
| Line 27: | Line 27: | ||
int tmp1, tmp2; | int tmp1, tmp2; | ||
scanf("%d %d", &tmp1, &tmp2); | scanf("%d %d", &tmp1, &tmp2); | ||
arr | arr[tmp1][tmp2] = 1; | ||
arr | arr[tmp2][tmp1] = 1; | ||
} | } | ||
DFS(V); | DFS(V); | ||
| Line 35: | Line 35: | ||
visitNum = 0; | visitNum = 0; | ||
for (int i = 0; i<=N; i++) { | for (int i = 0; i<=N; i++) { | ||
visit | visit[i] = 0; | ||
} | } | ||
queue<int> s; | queue<int> s; | ||
| Line 44: | Line 44: | ||
printf("%d ", now); | printf("%d ", now); | ||
visitNum++; | visitNum++; | ||
visit | visit[now] = 1; | ||
for (int i = 0; i <= N; i++) { | for (int i = 0; i <= N; i++) { | ||
if (arr | if (arr[now][i] == 1 && visit[i] == 0) { | ||
visit | visit[i] = 1; | ||
s.push(i); | s.push(i); | ||
} | } | ||
| Line 60: | Line 60: | ||
} | } | ||
visitNum++; | visitNum++; | ||
visit | visit[now] = 1; | ||
for (int i = 0; i<=N; i++) { | for (int i = 0; i<=N; i++) { | ||
if (arr | if (arr[now][i] == 1 && visit[i] == 0) { | ||
DFS(i); | DFS(i); | ||
} | } | ||
| Line 73: | Line 73: | ||
#include <algorithm> | #include <algorithm> | ||
std::vector<int> a | std::vector<int> a[1001]; | ||
bool visit | bool visit[1001] = { false, }; | ||
void dfs(int s, int n) { | void dfs(int s, int n) { | ||
visit | visit[s] = true; | ||
printf("%d ", s); | printf("%d ", s); | ||
for (int i = 0; i < a | for (int i = 0; i < a[s].size(); i++) { | ||
if (!visit | if (!visit[a[s][i]]) dfs(a[s][i], n); | ||
} | } | ||
} | } | ||
| Line 89: | Line 89: | ||
for (int i = 1; i <= n; i++) | for (int i = 1; i <= n; i++) | ||
visit | visit[i] = false; | ||
q.push(s); | q.push(s); | ||
visit | visit[s] = true; | ||
for (int i = 0; !q.empty(); i++) { | for (int i = 0; !q.empty(); i++) { | ||
int qf = q.front(); | int qf = q.front(); | ||
for (int j = 0; j < a | for (int j = 0; j < a[qf].size(); j++) { | ||
if (!visit | if (!visit[a[qf][j]]) { | ||
q.push(a | q.push(a[qf][j]); | ||
visit | visit[a[qf][j]] = true; | ||
} | } | ||
} | } | ||
| Line 113: | Line 113: | ||
int x, y; | int x, y; | ||
scanf("%d %d", &x, &y); | scanf("%d %d", &x, &y); | ||
a | a[x].push_back(y); | ||
a | a[y].push_back(x); | ||
} | } | ||
for (int i = 1; i <= n; i++) | for (int i = 1; i <= n; i++) | ||
std::sort(a | std::sort(a[i].begin(),a[i].end()); | ||
dfs(v, n); | dfs(v, n); | ||
| Line 139: | Line 139: | ||
void put(int tmp); | void put(int tmp); | ||
int stack | int stack[100]; | ||
int top, bottom; | int top, bottom; | ||
int queue | int queue[100]; | ||
int front, rear; | int front, rear; | ||
| Line 156: | Line 156: | ||
graph = (int**)malloc(sizeof(int*)*(n + 1)); | graph = (int**)malloc(sizeof(int*)*(n + 1)); | ||
for (int i = 0; i < n; i++) { | for (int i = 0; i < n; i++) { | ||
graph | graph[i + 1] = (int*)malloc(sizeof(int)*(n + 1)); | ||
for (int j = 0; j < n; j++) { | for (int j = 0; j < n; j++) { | ||
graph | graph[i + 1][j + 1] = 0; | ||
} | } | ||
} | } | ||
| Line 165: | Line 165: | ||
int tmp1, tmp2; | int tmp1, tmp2; | ||
scanf("%d%d", &tmp1, &tmp2); | scanf("%d%d", &tmp1, &tmp2); | ||
graph | graph[tmp1][tmp2] = 1; | ||
graph | graph[tmp2][tmp1] = 1; | ||
} | } | ||
| Line 182: | Line 182: | ||
test = 0; | test = 0; | ||
for (int k = 0; k <= top; k++) { | for (int k = 0; k <= top; k++) { | ||
if (stack | if (stack[k] == i + 1) { | ||
test = 1; | test = 1; | ||
break; | break; | ||
} | } | ||
} | } | ||
if (graph | if (graph[j][i + 1] == 1 && test == 0) { | ||
j = i + 1; | j = i + 1; | ||
printf("%d ", j); | printf("%d ", j); | ||
| Line 207: | Line 207: | ||
printf("%d ", getTmp); | printf("%d ", getTmp); | ||
for (int i = 0; i < n; i++) { | for (int i = 0; i < n; i++) { | ||
if (graph | if (graph[getTmp][i + 1] == 1) { | ||
put(i + 1); | put(i + 1); | ||
} | } | ||
| Line 217: | Line 217: | ||
int pop() { | int pop() { | ||
return stack | return stack[top--]; | ||
} | } | ||
void push(int tmp) { | void push(int tmp) { | ||
for (int i = 0; i < top; i++) { | for (int i = 0; i < top; i++) { | ||
if (stack | if (stack[i] == tmp) | ||
return; | return; | ||
} | } | ||
stack | stack[++top] = tmp; | ||
} | } | ||
int get() { | int get() { | ||
return queue | return queue[front++]; | ||
} | } | ||
void put(int tmp) { | void put(int tmp) { | ||
for (int i = 0; i < rear; i++) { | for (int i = 0; i < rear; i++) { | ||
if (queue | if (queue[i] == tmp) | ||
return; | return; | ||
} | } | ||
queue | queue[rear++] = tmp; | ||
} | } | ||
= 코드(상자 넣기) = | = 코드(상자 넣기) = | ||
| Line 257: | Line 257: | ||
max = 0; | max = 0; | ||
for(int j = 0; j < i; j++){ | for(int j = 0; j < i; j++){ | ||
if(num | if(num[j] > max && vec[j] < temp){ | ||
max = num | max = num[j]; | ||
} | } | ||
} | } | ||
num | num[i] = max + 1; | ||
} | } | ||
max = 0; | max = 0; | ||
for(int i = 0; i<N; i++){ | for(int i = 0; i<N; i++){ | ||
if(num | if(num[i] > max){ | ||
max = num | max = num[i]; | ||
} | } | ||
} | } | ||
| Line 274: | Line 274: | ||
#include <iostream> | #include <iostream> | ||
int a | int a[1001],dp[1001]; | ||
int main() | int main() | ||
| Line 281: | Line 281: | ||
//입력 | //입력 | ||
std::cin>>n; | std::cin>>n; | ||
for(i=0;i<n;i++) std::cin>>a | for(i=0;i<n;i++) std::cin>>a[i]; | ||
//dp strat | //dp strat | ||
for(i=0;i<n;i++) | for(i=0;i<n;i++) | ||
| Line 287: | Line 287: | ||
for(j=0;j<i;j++) | for(j=0;j<i;j++) | ||
{ | { | ||
if(a | if(a[j]<a[i] && dp[j]>=dp[i]) dp[i]=dp[j]+1; | ||
} | } | ||
if(dp | if(dp[i]==0) dp[i]++; | ||
if(dp | if(dp[i]>max) max=dp[i]; | ||
} | } | ||
//출력 | //출력 | ||
| Line 346: | Line 346: | ||
== 박인서 == | == 박인서 == | ||
* DFS와 BFS : DFS는 재귀 이용, BFS는 큐 이용 | * DFS와 BFS : DFS는 재귀 이용, BFS는 큐 이용 | ||
* 상자 넣기 : dp | * 상자 넣기 : dp[i]는 그 상자 기준 가장 많은 상자를 넣을 수 있는 가짓수입니다. 이것을 이용하여 계속 DP로 풀어나가면 됩니다. | ||
== 곽정흠 == | == 곽정흠 == | ||
Revision as of 14:46, 26 March 2026
오늘의 문제
참가자
- 15이원준, 박인서, 곽정흠
코드(DFS와 BFS)
15이원준
#include<iostream>
#include<queue>
using namespace std;
void DFS(int now);
int arr[1010][1010] = { 0, };
int visit[1010] = { 0, };
int N, M, V;
int visitNum = 0;
int main() {
scanf("%d %d %d", &N, &M, &V);
for (int i = 0; i< M; i++) {
int tmp1, tmp2;
scanf("%d %d", &tmp1, &tmp2);
arr[tmp1][tmp2] = 1;
arr[tmp2][tmp1] = 1;
}
DFS(V);
cout << '\n';
visitNum = 0;
for (int i = 0; i<=N; i++) {
visit[i] = 0;
}
queue<int> s;
s.push(V);
while (!s.empty() || visitNum != N) {
int now = s.front();
s.pop();
printf("%d ", now);
visitNum++;
visit[now] = 1;
for (int i = 0; i <= N; i++) {
if (arr[now][i] == 1 && visit[i] == 0) {
visit[i] = 1;
s.push(i);
}
}
}
}
void DFS(int now) {
printf("%d ", now);
if (visitNum == N) {
return;
}
visitNum++;
visit[now] = 1;
for (int i = 0; i<=N; i++) {
if (arr[now][i] == 1 && visit[i] == 0) {
DFS(i);
}
}
}
박인서
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
std::vector<int> a[1001];
bool visit[1001] = { false, };
void dfs(int s, int n) {
visit[s] = true;
printf("%d ", s);
for (int i = 0; i < a[s].size(); i++) {
if (!visit[a[s][i]]) dfs(a[s][i], n);
}
}
void bfs(int s, int n) {
std::queue<int> q;
for (int i = 1; i <= n; i++)
visit[i] = false;
q.push(s);
visit[s] = true;
for (int i = 0; !q.empty(); i++) {
int qf = q.front();
for (int j = 0; j < a[qf].size(); j++) {
if (!visit[a[qf][j]]) {
q.push(a[qf][j]);
visit[a[qf][j]] = true;
}
}
printf("%d ", q.front());
q.pop();
}
}
int main()
{
int n, m, v;
scanf("%d %d %d", &n, &m, &v);
for (int i = 0; i < m; i++) {
int x, y;
scanf("%d %d", &x, &y);
a[x].push_back(y);
a[y].push_back(x);
}
for (int i = 1; i <= n; i++)
std::sort(a[i].begin(),a[i].end());
dfs(v, n);
printf("\n");
bfs(v, n);
return 0;
}
곽정흠
백준에서는 런타임오류란다 비주얼스튜디오는 잘 되는데..
#include <stdio.h>
#include <stdlib.h>
int pop();
void push(int tmp);
int get();
void put(int tmp);
int stack[100];
int top, bottom;
int queue[100];
int front, rear;
int main(void) {
int** graph;
int n, m, v;
int popTmp;
int getTmp;
scanf("%d%d%d", &n, &m, &v);
graph = (int**)malloc(sizeof(int*)*(n + 1));
for (int i = 0; i < n; i++) {
graph[i + 1] = (int*)malloc(sizeof(int)*(n + 1));
for (int j = 0; j < n; j++) {
graph[i + 1][j + 1] = 0;
}
}
for (int i = 0; i < m; i++) {
int tmp1, tmp2;
scanf("%d%d", &tmp1, &tmp2);
graph[tmp1][tmp2] = 1;
graph[tmp2][tmp1] = 1;
}
//dfs
top = -1;
bottom = 0;
push(v);
while (top != n - 2) {
int j, test;
popTmp = pop();
printf("%d ", popTmp);
j = popTmp;
for (int i = 0; i < n; i++) {
test = 0;
for (int k = 0; k <= top; k++) {
if (stack[k] == i + 1) {
test = 1;
break;
}
}
if (graph[j][i + 1] == 1 && test == 0) {
j = i + 1;
printf("%d ", j);
push(j);
i = 0;
}
}
}
printf("\n");
//bfs
front = 0;
rear = 0;
put(v);
while (front != rear) {
getTmp = get();
printf("%d ", getTmp);
for (int i = 0; i < n; i++) {
if (graph[getTmp][i + 1] == 1) {
put(i + 1);
}
}
}
return 0;
}
int pop() {
return stack[top--];
}
void push(int tmp) {
for (int i = 0; i < top; i++) {
if (stack[i] == tmp)
return;
}
stack[++top] = tmp;
}
int get() {
return queue[front++];
}
void put(int tmp) {
for (int i = 0; i < rear; i++) {
if (queue[i] == tmp)
return;
}
queue[rear++] = tmp;
}
코드(상자 넣기)
15이원준
#include<iostream>
#include<vector>
using namespace std;
int main(){
int N, max;
vector<int> vec;
vector<int> num;
scanf("%d", &N);
num.resize(N);
for(int i = 0; i < N; i++){
int temp;
scanf("%d", &temp);
vec.push_back(temp);
max = 0;
for(int j = 0; j < i; j++){
if(num[j] > max && vec[j] < temp){
max = num[j];
}
}
num[i] = max + 1;
}
max = 0;
for(int i = 0; i<N; i++){
if(num[i] > max){
max = num[i];
}
}
printf("%d\n", max);
}
박인서
#include <iostream>
int a[1001],dp[1001];
int main()
{
int n,i,j,max=0;
//입력
std::cin>>n;
for(i=0;i<n;i++) std::cin>>a[i];
//dp strat
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(a[j]<a[i] && dp[j]>=dp[i]) dp[i]=dp[j]+1;
}
if(dp[i]==0) dp[i]++;
if(dp[i]>max) max=dp[i];
}
//출력
std::cout<<max<<'\n';
return 0;
}
곽정흠
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int size;
int canPut;
}box;
int main() {
int num;
box* boxes;
int maxCanPut = 0; //현재까지 최대
scanf("%d", &num);
boxes = (box*)malloc(sizeof(box)*num);
for (int i = 0; i < num; i++) {
scanf("%d", &((boxes + i)->size));
}
for (int idx = 0; idx < num; idx++) {
maxCanPut = 0;
for (int i = 0; i < idx; i++) {
if ((boxes + i)->size < (boxes + idx)->size) {
if (maxCanPut < (boxes + i)->canPut) {
maxCanPut = (boxes + i)->canPut;
}
}
}
(boxes + idx)->canPut = maxCanPut + 1;
}
maxCanPut = boxes->canPut;
for (int i = 1; i < num; i++) {
if ((boxes + i)->canPut > maxCanPut) {
maxCanPut = (boxes + i)->canPut;
}
}
printf("%d", maxCanPut);
return 0;
}
아이디어
15이원준
박인서
* DFS와 BFS : DFS는 재귀 이용, BFS는 큐 이용 * 상자 넣기 : dp[i]는 그 상자 기준 가장 많은 상자를 넣을 수 있는 가짓수입니다. 이것을 이용하여 계속 DP로 풀어나가면 됩니다.