https://www.acmicpc.net/problem/2263 위 그림으로 예시를 들어보자. 전위 순회를 했을 경우 1 2 3 4 5 6 7 중위 순회를 했을 경우 3 2 4 1 6 5 7 후위 순회를 했을 경우 3 4 2 6 7 5 1 중위 순회를 배열로 나타냈을 경우 root의 위치는 가운데에 있다. 1을 기준으로 왼쪽을 바라봤을 때 3 2 4는 가운데 2를 부모노드로 다시 한 번 왼쪽과 오른쪽을 나누고있다 1을 기준으로 오른쪽을 바라봤을 때 5가 부모노드이며 왼쪽과 오른쪽을 나눈다. 후위 순회를 배열로 나타낸 경우에는 루트가 마지막 인덱스에 자리잡고 있다. 왼쪽은 다시 한번 2가 루트노드가 될 것이고 오른쪽은 5가 루트노드가 될 것이다. 마지막 인덱스가 루트노드인 것을 이용하여 코드를 짜보도록 ..
https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로 www.acmicpc.net #include #include using namespace std; int map[1001][1001]; int visited[1001][1001][2]; int dy[4] = {1, -1, 0, 0}; int dx[4] = {0, 0, -1, 1}; int N; int M; int bfs(){ queue q; q.push(make_pair(make_pair(0, 0),..
https://www.acmicpc.net/problem/1504 1504번: 특정한 최단 경로 첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존 www.acmicpc.net #include #include #include #define INF 100000000 using namespace std; vector a[801]; int dist[801]; int N; int E; void dijkstra(int start){ for(int i = 0; i ncost + cost){ dist[next] = ncost + cost;..
https://www.acmicpc.net/problem/1167 1167번: 트리의 지름 트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 www.acmicpc.net #include #include #include using namespace std; vector a[100001]; int visited[100001]; int ans = 0; int endpoint; void dfs(int start, int length){ if(visited[start] == true){ return; } if(ans < length){ ans = lengt..