Step-by-Step

[Java] 백준 15591 - Mootube(Silver) 본문

언어/JAVA

[Java] 백준 15591 - Mootube(Silver)

희주(KHJ) 2022. 6. 30. 14:32

https://www.acmicpc.net/problem/15591

 

15591번: MooTube (Silver)

농부 존은 1번 동영상과 2번 동영상이 USADO 3을 가지고, 2번 동영상과 3번 동영상이 USADO 2를 가지고, 2번 동영상과 4번 동영상이 USADO 4를 가진다고 했다. 이것에 기반해서 1번 동영상과 3번 동영상의

www.acmicpc.net

항상 느끼는거지만 문제를 풀때 기본적으로

1. Scanner보다는 BufferedReader 사용

2. 배열 보다는 ArrayList 사용

이게 기본으로 들어가야 하는거같다...

 

괜히 엄한 곳에서 시간초과나서 전체적으로 수정하느라 시간 오래 걸릴바에는 

귀찮더라도 처음부터 이렇게 쓰는게 나을듯 하다

솔직히 I/O부분은 Scanner랑 print 쓰는게 훨씬 손에 익고 편하지만ㅠㅠㅋㅋㅋㅋ

 

package BOJ;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class boj15591 {	
	private static ArrayList<int[]>[] arr;
	private static int N,Q;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		
		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		Q = Integer.parseInt(st.nextToken());
		
		// n번째 int[] => (k요소, 거리)
		arr = new ArrayList[N+1];
		
		// 모든 점에 대하여 ArrayList 생성
		for(int i=1; i<=N; i++) {
			arr[i] = new ArrayList<>();
		}
		
		// P번째 ArrayList에 q까지의 거리 r 데이터 넣어줌
		for(int i=1; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			int p = Integer.parseInt(st.nextToken());
			int q = Integer.parseInt(st.nextToken());
			int r = Integer.parseInt(st.nextToken());
			
			arr[p].add(new int[] {q,r});
			arr[q].add(new int[] {p,r});
		}
		
		
		for(int i=1; i<=Q; i++) {
			st = new StringTokenizer(br.readLine());
			int k = Integer.parseInt(st.nextToken());
			int v = Integer.parseInt(st.nextToken());
			int res = bfs(k,v);
			bw.write(res+"\n");
		}
		bw.flush();
		bw.close();
	}
	
	public static int bfs(int k, int v) {
		int cnt = 0;
		
		// 방문한 정점 표시
		boolean[] visited =  new boolean[N+1];
		// 자기 자신
		visited[v]=true;
		
		
		Queue<Integer> q = new LinkedList<>();
		q.add(v);
		
		// BFS 방식으로 탐색
		while(!q.isEmpty()) {
			int que = q.poll();
			
			// ArrayList에 있는 요소,거리 가져옴
			for(int[] a : arr[que]) {
				// 방문 X && USADO k 이상인 경우
				if(!visited[a[0]] && a[1] >= k) {
					// 방문여부 true로 바꾸고 q에 넣어줌
					visited[a[0]] = true;
					q.add(a[0]);
					// 조건에 맞는 경우 cnt 개수 올리기
					cnt++;
				}
			}
		}
		return cnt;
	}
}

- Arraylist 내부의 경우 어떤 사람들은 int[] 형식으로 하지 않고 Node 클래스를 만들어서 객체에 저장하도록 한거같다.

- 다시 풀때는 Node 클래스로 도전해보아야겠음

 

Comments