diff --git a/12/15681.c++ b/12/15681.c++ new file mode 100644 index 0000000..a81234d --- /dev/null +++ b/12/15681.c++ @@ -0,0 +1,45 @@ +#include +#include + +using namespace std; + +//1. 모든 간선 정보를 이차원 벡터에 저장한다. +//2. 각 노드의 정점의 수를 저장할 수 있는 vector node(n+1,1) 을 만든다. (초기값이 1인 이유는 자기 자신도 포함해야하기 때문) +//3. dfs를 통해 가장 마지막 자식 노드(자식이 없는 노드)의 정점의 수를 부모 노드의 정점 수에 더하도록 한다. + +void dfs(int cur, int prev, vector>& v, vector& 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> graph(n+1,vector(0)); + int u,v; + for(int i=0;i> u >> v; + graph[u].push_back(v); + graph[v].push_back(u); + } + + vector node(n+1,1); //각 트리의 자식 노드 수 + dfs(r, 0, graph, node); + + for(int i=0;i> u; + cout << node[u] << "\n"; + } + + return 0; +} \ No newline at end of file diff --git a/12/3190.c++ b/12/3190.c++ new file mode 100644 index 0000000..504a431 --- /dev/null +++ b/12/3190.c++ @@ -0,0 +1,83 @@ +#include +#include +#include + +using namespace std; + +int direction(char c){ + switch (c){ + case 'L': //왼쪽 회전 + return 1; + case 'D': //오른쪽 회전 + return -1; + } +} + +int move(vector>& v, queue > 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 > 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> v(n+1,vector(n+1,0)); + v[1][1]=1; //맨위 맨좌측에서 시작 + while(k--){ + cin >> n1 >> n2; + v[n1][n2] = 2; //사과 표시 + } + + queue > 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; +} \ No newline at end of file