본문 바로가기
Problem Solving/백준

백준 16437 : 양 구출 작전

by Libi 2021. 7. 3.
반응형

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

 

16437번: 양 구출 작전

2, 3, 5번에 사는 모든 양들은 1번 섬으로 갈 수 있지만 7번 섬에 사는 양들은 1번 섬으로 가기 위하여 6번 섬을 거쳐야 하는데 6번 섬에 사는 늑대들의 수가 7번 섬에 사는 양들의 수보다 많으므로

www.acmicpc.net

[ 문제풀이 ]

골드 2 난이도 치고는 굉장히 간단한 문제이다. "각 섬에서 1번 섬으로 가는 경로는 유일하다"라는 문장 때문에 모든 섬을 연결한 상태는 그래프가 아닌 트리라는 것을 알 수 있다.

따라서 1번 노드를 기준으로 dfs를 수행하며 말단 노드부터 거슬러 올라오면서 양 or 늑대인 경우를 처리해주면 쉽게 해결할 수 있다.

주의해야 할 점은 정답의 범위가 int 범위를 넘어갈 수 있기 때문에 long 타입으로 받아줘야 한다.

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.List;
import java.util.StringTokenizer;

public class Main {
	
	static int N;
	static int[] vertex;
	static List<Integer>[] edgeList;
	static boolean[] visit;
	
	public static void main(String[] args) throws IOException {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))){
			N = Integer.parseInt(br.readLine());
			vertex = new int[N + 1];
			edgeList = new ArrayList[N + 1];
			visit = new boolean[N + 1];
			for (int i = 0; i <= N; ++i) edgeList[i] = new ArrayList<>();
			for (int i = 2; i <= N; ++i) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				String kind = st.nextToken();
				int cnt = Integer.parseInt(st.nextToken());
				int to = Integer.parseInt(st.nextToken());
				vertex[i] = kind.equals("S") ? cnt : -cnt;
				edgeList[to].add(i);
			}
			
			bw.write(dfs(1) + "\n");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static long dfs(int v) {
		if (edgeList[v].isEmpty()) return vertex[v] > 0 ? vertex[v] : 0;
		
		visit[v] = true;
		long sum = vertex[v];
		for (int nv : edgeList[v]) {
			if (visit[nv]) continue;
			sum += dfs(nv);
		}

		return sum > 0 ? sum : 0;
	}
}
반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 2211 : 네트워크 복구  (0) 2021.07.05
백준 1525 : 퍼즐  (0) 2021.07.04
백준 2239 : 스도쿠  (0) 2021.07.01
백준 5719 : 거의 최단 경로  (0) 2021.06.30
백준 1593 : 문자 해독  (0) 2021.06.29

댓글