Home G14699. 관악산 등산
Post
Cancel

G14699. 관악산 등산

문제

image


제출 코드

image


  • 사용 알고리즘 : 트리, BFS


가장 높은 쉼터에서부터 시작해서 더 낮은 쉼터로 내려가며 각 쉼터의 최대 방문횟수를 계산했다.

최대 방문횟수를 저장할 result 배열을 만들고, 가장 높은 쉼터부터 방문해서 해당 쉼터의 result값이 0이면 그 쉼터와 연결된 더 낮은 쉼터들을 bfs로 찾아 각 쉼터의 result값을 넣는다.

낮은 쉼터 중 이미 방문한 쉼터에 대하여, 이번 방문횟수가 더 큰 경우에는 그 하위의 쉼터들도 다시 값을 갱신해줘야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package gold;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

public class G14699_mountainClimbing {
	static int[] height, result;
	static List<Integer>[] edges;

	static class Node implements Comparable<Node>{
		int idx, height; // idx:쉼터번호, height:높이, shelter:오를 수 있는 최대 쉼터 수

		Node(int idx, int height){
			this.idx = idx;
			this.height = height;
		}
		@Override
		public int compareTo(Node o) { // 오름차순 정렬
			return o.height - this.height;
		}

	}

	static void bfs(int start) {
		result[start] = 1;
		Queue<Integer> queue = new LinkedList<Integer>();
		queue.add(start);

		int cnt = 1;
		while(!queue.isEmpty()) {
			cnt++;
			int size = queue.size();

			for(int s=0; s<size; s++) {
				int now = queue.poll();

				for(int n : edges[now]) {
					if(height[n]<height[now] && result[n]<cnt) {
						result[n] = cnt;
						queue.add(n);
					}
				}

			}
		}
	}
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());

		Node[] nodes = new Node[N];
		height = new int[N+1];
		edges = new List[N+1];

		st = new StringTokenizer(br.readLine());
		for(int i=0; i<N; i++) {
			int h = Integer.parseInt(st.nextToken());
			nodes[i] = new Node(i+1, h);
			height[i+1] = h;
			edges[i+1] = new ArrayList<Integer>();
		}

		Arrays.sort(nodes);

		for(int i=0; i<M; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			edges[a].add(b);
			edges[b].add(a);
		}

		result = new int[N+1];
		for(int i=0; i<N; i++) {
			if(result[nodes[i].idx]==0) bfs(nodes[i].idx);
		}

		StringBuilder sb = new StringBuilder();
		for(int i=1; i<=N; i++) sb.append(result[i]+"\n");
		System.out.println(sb);
	}

}
This post is licensed under CC BY 4.0 by the author.