트리의 부모 찾기 성공
1 초 | 256 MB | 88701 | 39820 | 27995 | 42.579% |
문제
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
예제 입력 1 복사
7
1 6
6 3
3 5
4 1
2 4
4 7
예제 출력 1 복사
4
6
1
3
1
4
예제 입력 2 복사
12
1 2
1 3
2 4
3 5
3 6
4 7
4 8
5 9
5 10
6 11
6 12
예제 출력 2 복사
1
1
2
3
3
4
4
5
5
6
6
문제 페이지에 들어가서 조금 당황했다.
이유: 문제 복사해온 걸 보면 알겠지만 이미 성공한 문제임 ㅎ.... 아마 개어려운 코딩스터디(나에게는)에 들어갔다가 장문의 사과와 함께 탈주했엇는데 그 때 꾸역꾸역 풀었던 문제가 아니었나 싶다 이게 거기서 제일 쉬운 문제였다 하하! 나에겐 참 어려운데 말입니다
그 때는 C로 풀었어서 자바로 다시 풀어보기로 했다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODES 100001
typedef struct Node {
int vertex;
struct Node* next;
} Node;
Node* graph[MAX_NODES];
int visited[MAX_NODES];
int parent[MAX_NODES];
void addEdge(int u, int v) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = v;
newNode->next = graph[u];
graph[u] = newNode;
}
void bfs(int start) {
int queue[MAX_NODES];
int front = 0, rear = 0;
queue[rear++] = start;
visited[start] = 1;
while (front < rear) {
int current = queue[front++];
Node* temp = graph[current];
while (temp != NULL) {
int adjacent = temp->vertex;
if (!visited[adjacent]) {
visited[adjacent] = 1;
parent[adjacent] = current;
queue[rear++] = adjacent;
}
temp = temp->next;
}
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n - 1; i++) {
int u, v;
scanf("%d %d", &u, &v);
addEdge(u, v);
addEdge(v, u);
}
bfs(1);
for (int i = 2; i <= n; i++) {
printf("%d\n", parent[i]);
}
return 0;
}
그 때 제출했던 c코드...^^ 너무 어려웠어요 저는.
근데 진짜 문제는 지금 봐도 모르겠고 어떻게 푼 지 기억도 안 나고 어떻게 풀어야 할 지 모르겠다는 거다^^
그니깐 이게 입력 N은 ㄴ도ㅡ 개수...
루트는 무조건 1이고
둘째 줄부터는 연결된 정점이 주어지는 것....!
예제1을 보면은 연결된 정점 1 6 있으니까 1-6 이어짐 4-1도 이어졌으니까 1 밑에 4 6이 있겠죠? 머 이런 식으로 하라는 겁니다 그래서 2의 부모 노드는 4 이런 식으로 출력하라는 것!
1
/ \
4 6
/ \ \
2 7 3
\
5
이이렇게요..... 맞나? 맞겠지....
아 진심 이거 자바로 구현하려니까 Dog헷갈리네요
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class BJ_11725 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 트리의 인접 리스트 생성
List<List<Integer>> tree = new ArrayList<>();
for (int i = 0; i < N + 1; i++) {
tree.add(new ArrayList<>());
}
// 정점 입력 받기
for (int i = 0; i < N - 1; i++) {
String[] input = br.readLine().split(" ");
int u = Integer.parseInt(input[0]);
int v = Integer.parseInt(input[1]);
tree.get(u).add(v);
tree.get(v).add(u);
}
// 부모 노드 저장
int[] parent = new int[N + 1];
Queue<Integer> queue = new LinkedList<>(); // BFS 탐색
boolean[] visited = new boolean[N + 1]; // 방문 여부 확인
queue.add(1); // 루트 노드
visited[1] = true; // 방문!
// BFS, 큐 빌 때까지 반복
while (!queue.isEmpty()) {
int current = queue.poll();
for (int child : tree.get(current)) {
if (!visited[child]) {
visited[child] = true; // 방문 표시
parent[child] = current; // 부모 노드 기록
queue.add(child);
}
}
}
// 2번 노드부터 부모 출력
for (int i = 2; i <= N; i++) {
System.out.println(parent[i]);
}
}
}
^^... 저 2차원 리스트를 보시면 알겠지만 또다시 구글링을 했답니다...! 자바로 하니까 잘 모르겠는걸 헤헷 글고 왜 복붙하니까 자꾸 들여쓰기가 이상해지는지 모르겠다.
결과는 어마어마하게 심각한 메모리와 시간으로 성공했다는 거다. 밑에 C랑 비교하면 참... 뭐가 문제지? 일단 시간이 없으니 나중에 확인하도록 하자.
'백준 풀기' 카테고리의 다른 글
백준 2630번: 색종이 만들기 with Java (0) | 2024.08.18 |
---|---|
백준 9020번: 골드바흐의 추측 with Java (0) | 2024.08.17 |
백준 11279번: 최대 힙 with Java (0) | 2024.08.10 |
백준 1449번: 수리공 항승 with Java (0) | 2024.07.28 |
백준 1213번: 팰린드롬 만들기 with Java (0) | 2024.07.27 |