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

[최단경로] 2176300 이지현 #349

Open
wants to merge 3 commits into
base: 2176300-이지현2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
44 changes: 43 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,48 @@
"algorithm": "cpp",
"xiosbase": "cpp",
"xlocale": "cpp",
"xutility": "cpp"
"xutility": "cpp",
"atomic": "cpp",
"bit": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"compare": "cpp",
"concepts": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"deque": "cpp",
"exception": "cpp",
"initializer_list": "cpp",
"ios": "cpp",
"istream": "cpp",
"iterator": "cpp",
"limits": "cpp",
"map": "cpp",
"memory": "cpp",
"new": "cpp",
"ostream": "cpp",
"queue": "cpp",
"set": "cpp",
"stack": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"typeinfo": "cpp",
"xfacet": "cpp",
"xlocinfo": "cpp",
"xlocnum": "cpp",
"xmemory": "cpp",
"xstddef": "cpp",
"xstring": "cpp",
"xtr1common": "cpp",
"xtree": "cpp"
}
}
66 changes: 66 additions & 0 deletions 12_트리/라이브 코딩/BOJ_1991.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#include <iostream>
#include <map>

using namespace std;

map<char, pair<char, char>> tree;

// 전위 순회는 V - L - R
void preorder(char v)
{
if (v == '.')
{
return;
}
cout << v;
preorder(tree[v].first);
preorder(tree[v].second);
}

// 중위 순회 L - V - R
void inorder(char v)
{
if (v == '.')
{
return;
}

inorder(tree[v].first);
cout << v;
inorder(tree[v].second);
}

// 후위 순회 L - R - V
void postorder(char v)
{
if (v == '.')
{
return;
}

postorder(tree[v].first);
postorder(tree[v].second);
cout << v;
}

int main()
{
int n;
char root, left, right;

// 입력
cin >> n;
while (n--)
{
cin >> root >> left >> right;
tree[root] = {left, right};
}

// 연산 + 출력
preorder('A');
cout << '\n';
inorder('A');
cout << '\n';
postorder('A');
return 0;
}
99 changes: 99 additions & 0 deletions 12_트리/라이브 코딩/BOJ_4803.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#include <iostream>
#include <vector>

using namespace std;

// 결과 출력 함수
void printResult(int tc, int cnt)
{
cout << "Case " << tc << ": ";

switch (cnt)
{
case 0:
cout << "No trees.\n";
break;
case 1:
cout << "There is one tree.\n";
break;
default:
cout << "A forest of " << cnt << " trees.\n";
}
return;
}

void dfs(bool &flag, int cur, int prev, vector<vector<int>> &graph, vector<bool> &visited)
{

if (visited[cur])
{ // 방문했던 곳을 또 방문했다면 트리가 아니다
flag = false;
return;
}

visited[cur] = true; // 방문 체크

for (int next : graph[cur])
{
if (next == prev)
{
continue;
}
dfs(flag, next, cur, graph, visited);
}
return;
}

/*
* 각 그래프가 트리인지 아닌지 판단
* 사이클이 생기면 트리 아님
* 사이클이 생긴다 -> DFS로 자기 자신으로 돌아올 수 있다.
*/

int main()
{
int n, m, t, v1, v2;

for (t = 1;; t++)
{ // 테스트 케이스 번호

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

if (!n && !m)
{ // 종료 조건
break;
}

// 그래프 입력
vector<vector<int>> graph(n + 1, vector<int>(0));
for (int i = 0; i < m; i++)
{
cin >> v1 >> v2;
graph[v1].push_back(v2);
graph[v2].push_back(v1);
}

int cnt = 0; // 트리 수 카운트
vector<bool> visited(n + 1, false); // 방문 표시

for (int i = 1; i <= n; i++)
{
if (visited[i])
{
continue;
}

bool flag = true; // 트리인지 여부 저장하는 변수
dfs(flag, i, 0, graph, visited);
if (flag)
{
cnt++;
}
}

// 출력
printResult(t, cnt);
}
return 0;
}
71 changes: 71 additions & 0 deletions 12_트리/필수/BOJ_15681.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define MAX 100000 + 1 // MAX상수 선언

int n, r, q; // 정점 수, 루트 번호, 쿼리 수
int from, to; // 간선 입력
int q_num; // 쿼리 번호
vector<int> connect[MAX];
int dp[MAX];
bool visited[MAX];

void Input()
{
cin >> n >> r >> q;
for (int i = 0; i < n - 1; i++)
{
cin >> from >> to;
connect[from].push_back(to);
connect[to].push_back(from);
}
}

int countSubTree(int now)
{
if (visited[now])
{
return dp[now];
}
visited[now] = true;
int subTreeNum = 1;
for (int i = 0; i < connect[now].size(); i++)
{
int childNum = connect[now][i];
if (visited[childNum])
{
continue;
}
else
{
subTreeNum += countSubTree(childNum);
}
}
dp[now] = subTreeNum;
return dp[now];
}

int main()
{
ios_base ::sync_with_stdio(false); // 시간 단축
cin.tie(NULL);
cout.tie(NULL);

Input();

memset(visited, 0, sizeof(visited));
memset(dp, 0, sizeof(dp));
dp[r] = countSubTree(r); // 루트 노드로부터 자식 노드 구하기

for (int j = 0; j < q; j++)
{
cin >> q_num;
cout << dp[q_num] << '\n';
}

return 0;
}
100 changes: 100 additions & 0 deletions 12_트리/필수/BOJ_3190.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#include <iostream>
#include <vector>
#include <deque>
#include <map>

using namespace std;
typedef pair<int, int> ci; // <int,int>쌍의 구조체 ci선언

/**뱀 게임이 종료되는 시간 계산*/
int game(int n, vector<vector<int>> &state, map<int, int> &direction)
{
int dx[4] = {0, 1, 0, -1}; // 동(→), 남(↓), 서(←), 북(↑)
int dy[4] = {1, 0, -1, 0};
int time = 0; // 게임 시간
int dir = 0; // 뱀의 방향
int x, y, nx, ny; // 뱀의 머리 좌표를 나타낼 변수들

deque<ci> snake; // 뱀의 위치
snake.push_back({1, 1}); // 뱀의 시작 좌표 추가
state[1][1] = 2; // (1, 1)에 뱀이 있음을 표시

while (true)
{
x = snake.front().first; // 뱀의 머리 좌표
y = snake.front().second;
if (direction[time] != 0)
{ // 뱀의 방향 변환 정보가 있으면
dir = (dir + direction[time]) % 4; // 뱀의 방향 갱신
}
time++; // 게임 시간 1초 추가
nx = x + dx[dir]; // 뱀 머리의 다음 좌표
ny = y + dy[dir];

// 뱀의 머리가 벽에 부딪히거나 자기 자신의 몸과 부딪히면 게임 종료
if (!(0 < nx && nx <= n) || !(0 < ny && ny <= n) || state[nx][ny] == 2)
{
break; // 게임종료
}

snake.push_front({nx, ny}); // 뱀의 머리 좌표 추가
if (state[nx][ny] != 1)
{ // 새로 이동한 좌표에 사과가 없으면 꼬리 위치 비워주기
state[snake.back().first][snake.back().second] = 0; // 꼬리위치설정
snake.pop_back(); // 뱀의 위치 제거
}
state[nx][ny] = 2; // 뱀이 존재
}
return time; // 게임시간 반환
}
/**[백준 3190: 뱀]
* 뱀의 머리와 꼬리 좌표에 대한 접근 필요 -> deque 사용!
* state에 사과가 존재하면 해당 위치를 1, 뱀이 존재하면 2, 아무것도 없으면 0으로 설정
* 1. 뱀의 첫 시작 좌표인 {1, 1}을 s에 추가
* 2. 현재 뱀의 머리가 있는 좌표를 {x, y}로 받기
* 3. 뱀의 방향이 바뀌면 방향을 업데이트하고, 새로운 뱀의 머리 좌표를 {nx, ny}로 설정
* 4. 게임 시간 업데이트(time++)
* 4. 뱀의 머리가 벽이나 몸에 부딪히면 while문 종료
* 5-1. 새로 이동한 좌표를 s 앞부분에 추가
* 5-2. 새로 이동한 좌표에 사과가 없으면 기존 꼬리 좌표 값을 0으로 바꾸고 s에서 pop
* -> 사과가 있으면 몸길이가 1 늘어나지만 사과가 없으면 몸길이가 변하지 않으므로
* 6. 새로 이동한 좌표를 2로 표시
*/
int main()
{
int n, k, l, x; // 보드의 크기n, 사과의 개수 k, 뱀의 변환횟수 l, 게임시간 x초
char c; //
vector<vector<int>> state; // 사과의 위치를 나타낼 이중벡터state
map<int, int> direction; // 방향을 가리키는 map

// 입력
cin >> n >> k; // 보드의 크기, 사과의 개수 사용자정의
state.assign(n + 1, vector<int>(n + 1, 0)); // int로 구성된 n+1개의 vector를 0으로 초기화
while (k--) // k번 반복
{
int a, b; // 사과위치의 x좌표, y 좌표
cin >> a >> b; // 사용자정의
state[a][b] = 1; // 사과 위치 표시
}

cin >> l; // 방향변환 번수 사용자정의
while (l--) // l번 반복
{
cin >> x >> c;
if (c == 'D') //'D'이면
{
direction[x] = 1; // 오른쪽으로 회전
}
else // 'L'이면
{
direction[x] = 3; // 왼쪽으로 회전
}
}

// 연산
int time = game(n, state, direction); // 게임시간 반환

// 출력
cout << time;
return 0;
}
Loading