Skip to content
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
45 changes: 45 additions & 0 deletions 12/15681.c++
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#include <iostream>
#include <vector>

using namespace std;

//1. 모든 간선 정보를 이차원 벡터에 저장한다.
//2. 각 노드의 정점의 수를 저장할 수 있는 vector<int> node(n+1,1) 을 만든다. (초기값이 1인 이유는 자기 자신도 포함해야하기 때문)
//3. dfs를 통해 가장 마지막 자식 노드(자식이 없는 노드)의 정점의 수를 부모 노드의 정점 수에 더하도록 한다.

void dfs(int cur, int prev, vector<vector<int>>& v, vector<int>& node){
for(int next : v[cur]){
if(next==prev){
continue;
}
dfs(next, cur, v, node);
node[cur]+=node[next];
}
}

int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);

int n, r, q; //정점의 수, root, 쿼리의 수
cin >> n >> r >> q;

vector<vector<int>> graph(n+1,vector<int>(0));
int u,v;
for(int i=0;i<n-1;i++){
cin >> u >> v;
graph[u].push_back(v);
graph[v].push_back(u);
}

vector<int> node(n+1,1); //각 트리의 자식 노드 수
dfs(r, 0, graph, node);

for(int i=0;i<q;i++){
cin >> u;
cout << node[u] << "\n";
}

return 0;
}
83 changes: 83 additions & 0 deletions 12/3190.c++
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int direction(char c){
switch (c){
case 'L': //왼쪽 회전
return 1;
case 'D': //오른쪽 회전
return -1;
}
}

int move(vector<vector<int>>& v, queue <pair<int,char>> change, int num){
int t=0, r=1, c=1, i=0;
int n[4] = {0,-1,0,1}; //동, 남, 서, 북
int m[4] = {1,0,-1,0};

queue <pair<int,int>> snake;
snake.push({1,1});

while(true){
if(t==change.front().first){ //방향 변환
i += direction(change.front().second);
change.pop();
if(i>3){
i=0;
}
if(i<0){
i=3;
}
}

int n_r = r + n[i];
int n_c = c + m[i];
//맵 밖으로 나가거나 몸과 부딪히며면 끝
if(n_r<=0 || n_c<=0 || n_r>num || n_c>num || v[n_r][n_c]==1){
return t;
}
//아무것도 없는 칸이라면 꼬리 자름 (몸 길이 유지)
else if(v[n_r][n_c]==0){
v[snake.front().first][snake.front().second]=0;
snake.pop();
}
snake.push({n_r,n_c});
v[n_r][n_c]=1;
r = n_r;
c = n_c;
t++;
}
}

int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);

int n, k;
cin >> n >> k;

int n1, n2;
vector<vector<int>> v(n+1,vector<int>(n+1,0));
v[1][1]=1; //맨위 맨좌측에서 시작
while(k--){
cin >> n1 >> n2;
v[n1][n2] = 2; //사과 표시
}

queue <pair<int,char>> change; //방향 변환 정보 저장
int l, x;
char c;
cin >> l;
while(l--){
cin >> x >> c;
change.push(make_pair(x,c));
}
cout << move(v,change, n)+1;


return 0;
}