MooTube (Silver)
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 512 MB | 913 | 431 | 344 | 53.834% |
문제
농부 존은 남는 시간에 MooTube라 불리는 동영상 공유 서비스를 만들었다. MooTube에서 농부 존의 소들은 재밌는 동영상들을 서로 공유할 수 있다. 소들은 MooTube에 1부터 N까지 번호가 붙여진 N (1 ≤ N ≤ 5,000)개의 동영상을 이미 올려 놓았다. 하지만, 존은 아직 어떻게 하면 소들이 그들이 좋아할 만한 새 동영상을 찾을 수 있을지 괜찮은 방법을 떠올리지 못했다.
농부 존은 모든 MooTube 동영상에 대해 “연관 동영상” 리스트를 만들기로 했다. 이렇게 하면 소들은 지금 보고 있는 동영상과 연관성이 높은 동영상을 추천 받을 수 있을 것이다.
존은 두 동영상이 서로 얼마나 가까운 지를 측정하는 단위인 “USADO”를 만들었다. 존은 N-1개의 동영상 쌍을 골라서 직접 두 쌍의 USADO를 계산했다. 그 다음에 존은 이 동영상들을 네트워크 구조로 바꿔서, 각 동영상을 정점으로 나타내기로 했다. 또 존은 동영상들의 연결 구조를 서로 연결되어 있는 N-1개의 동영상 쌍으로 나타내었다. 좀 더 쉽게 말해서, 존은 N-1개의 동영상 쌍을 골라서 어떤 동영상에서 다른 동영상으로 가는 경로가 반드시 하나 존재하도록 했다. 존은 임의의 두 쌍 사이의 동영상의 USADO를 그 경로의 모든 연결들의 USADO 중 최솟값으로 하기로 했다.
존은 어떤 주어진 MooTube 동영상에 대해, 값 K를 정해서 그 동영상과 USADO가 K 이상인 모든 동영상이 추천되도록 할 것이다. 하지만 존은 너무 많은 동영상이 추천되면 소들이 일하는 것이 방해될까 봐 걱정하고 있다! 그래서 그는 K를 적절한 값으로 결정하려고 한다. 농부 존은 어떤 K 값에 대한 추천 동영상의 개수를 묻는 질문 여러 개에 당신이 대답해주기를 바란다.
입력
입력의 첫 번째 줄에는 N과 Q가 주어진다. (1 ≤ Q ≤ 5,000)
다음 N-1개의 줄에는 농부 존이 직접 잰 두 동영상 쌍의 USADO가 한 줄에 하나씩 주어진다. 각 줄은 세 정수 pi, qi, ri (1 ≤ pi, qi ≤ N, 1 ≤ ri ≤ 1,000,000,000)를 포함하는데, 이는 동영상 pi와 qi가 USADO ri로 서로 연결되어 있음을 뜻한다.
다음 Q개의 줄에는 농부 존의 Q개의 질문이 주어진다. 각 줄은 두 정수 ki와 vi(1 ≤ ki ≤ 1,000,000,000, 1 ≤ vi ≤ N)을 포함하는데, 이는 존의 i번째 질문이 만약 K = ki라면 동영상 vi를 보고 있는 소들에게 몇 개의 동영상이 추천될 지 묻는 것이라는 것을 뜻한다.
출력
Q개의 줄을 출력한다. i번째 줄에는 농부 존의 i번째 질문에 대한 답변이 출력되어야 한다.
예제 입력 1 복사
xxxxxxxxxx
4 3
1 2 3
2 3 2
2 4 4
1 2
4 1
3 1
예제 출력 1 복사
xxxxxxxxxx
3
0
2
풀이
클래스를 만들어서 비디오 - 거리 를 연결해주고
시작하는 비디오를 큐에 넣고 연결된 노드들을 탐색하면서 k보다 크거나 같으면 큐에 넣어주는 식으로 풀었습니다.
문제 이해하는데 오래 걸렸고 막상 구현은 쉽게 한 문제입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n,q;
static ArrayList<Node>[] list;
static boolean visited[];
static int ans = 0 ;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String [] input = br.readLine().split(" ");
n = Integer.parseInt(input[0]);
q = Integer.parseInt(input[1]);
list = new ArrayList[n+1];
for(int i=1; i<=n; i++) {
list[i] = new ArrayList<>();
}
for(int i=0; i<n-1; i++) {
input = br.readLine().split(" ");
int p = Integer.parseInt(input[0]);
int q = Integer.parseInt(input[1]);
int r = Integer.parseInt(input[2]);
list[p].add(new Node(q,r));
list[q].add(new Node(p,r));
}
for(int i=0; i<q; i++) {
ans= 0;
visited = new boolean[n+1];
input = br.readLine().split(" ");
int k = Integer.parseInt(input[0]); // usaco 수치
int v = Integer.parseInt(input[1]); // 몇번 비디오 보고있었는지
solve(k,v);
sb.append(ans);
sb.append("\n");
}
System.out.println(sb);
}
public static void solve(int k, int v) {
Queue<Node> q= new LinkedList<>();
q.add(new Node(v,Integer.MAX_VALUE));
while(!q.isEmpty()) {
Node a = q.poll();
visited[a.video] = true;
for(Node tmp : list[a.video]) {
if(visited[tmp.video]) {
continue;
}
int tmp_min = Math.min(tmp.dist, a.dist);
if(tmp_min >=k) {
ans++;
q.add(new Node(tmp.video,tmp_min));
visited[tmp.video] = true;
}
}
}
}
}
class Node{
int video, dist;
Node(int video, int dist){
this.video = video;
this.dist = dist;
}
}
'알고리즘' 카테고리의 다른 글
[백준 16967] 배열 복원하기 - JAVA // le_effort (0) | 2021.02.22 |
---|---|
[백준 17780] 새로운 게임 - JAVA // le_effort (0) | 2021.02.21 |
[SW Test 샘플문제] 프로세서 연결하기 - JAVA (0) | 2021.02.16 |
[프로그래머스] 메뉴 리뉴얼 - JAVA (0) | 2021.02.02 |
[프로그래머스] 타겟넘버 -JAVA (0) | 2021.02.02 |