(백준) 신년 파티 _ 1623

2022. 4. 1. 17:22·알고리즘/백준

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

 

🐢 설명

트리DP + 트래킹 문제이다.

 

문제를 정리해보면 자신의 직속상사가 참가하면 자신은 참가하지 않고, 직속상사가 불참하면 자신은 참가할 수 있으며 && 참가자들의 날나리 정도의 합이 최대가 되도록 하는 멤버 및 그때의 날나리 합을 구하면 된다. 근데 이때 사장이 참여하는 경우 / 참여하지 않는 경우 2가지에 대해 구해야 한다.

 

먼저, 상사의 참가여부에 부하의 참가여부가 달라지는 경우는 일반적인 트리 DP 문제로 2차원 dp배열을 통해 풀 수 있다.

  • 상사가 참여하는 경우
    • 부하는 참여하지 못함
  • 상사가 참여하지 않는 경우
    • 부하는 참여하거나
    • 부하는 참여하지 않음

이렇게 케이스를 나눠서 dp를 채워주면 된다.

 

하지만 이 문제에서는 추가적으로 참여하는 멤버를 뽑아줘야 하므로 추적을 위해 check[]을 추가로 필요로 한다. dp배열을 채울 때

참가일 경우 check[true]로 하고, 참가하지 않을 경우 check[false]를 해주면 된다.

 

이후 dfs로 탐색이 종료되고 난 후 사장 참여하는 경우 / 안하는 경우 나눠서 trace리스트를 check배열을 확인하면서 채워준다. 이때 상관이 참여하지 않는다고 해서 부하가 바로 참여하는게 아니라, check배열에서 더 이득이 되는 경우를 따져서 체크해주었으므로 trace를 채울 때도 상관이 불참일 때 부하의 참여여부를 보고 넣어줘야 한다. 

 

🐢코드
public class Main {
	static int N;
	static int[][] dp;
	static int YES = 0;
	static int NO = 1;
	static ArrayList<Integer> adj[];
	static ArrayList<Integer> trace;
	static boolean[] check;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		N = Integer.parseInt(br.readLine());
		dp = new int[2][N + 1];
		adj = new ArrayList[N + 1];
		check = new boolean[N + 1];

		st = new StringTokenizer(br.readLine());
		for (int i = 1; i < N + 1; i++) {
			adj[i] = new ArrayList<>();
			dp[YES][i] = Integer.parseInt(st.nextToken());
		}

		st = new StringTokenizer(br.readLine());
		for (int i = 2; i < N + 1; i++) {
			int boss = Integer.parseInt(st.nextToken());
			adj[boss].add(i);
		}

		StringBuilder answer = new StringBuilder();
		trace = new ArrayList<>();

		dfs(1);
		answer.append(dp[YES][1]).append(" ").append(dp[NO][1]).append("\n");

		// 사장이 참여할 때 참가자 추적
		traceDfs(1, YES);
		trace.sort(null);
		for (Integer t : trace) {
			answer.append(t).append(" ");
		}
		answer.append("-1").append("\n");

		// 사장이 불참할 때 참가자 추적
		trace.clear();
		traceDfs(1, NO);
		trace.sort(null);
		for (Integer t : trace) {
			answer.append(t).append(" ");
		}
		answer.append("-1");

		System.out.println(answer);
	}

	private static void dfs(int root) {
    	// 일단 상사는 참여한다고 체크
		for (Integer child : adj[root]) {
			dfs(child);
			dp[YES][root] += dp[NO][child];
			check[root] = true;

			// 부하가 참여하는거가 이득이면 부하가 참여한다고 체크
			if (dp[YES][child] >= dp[NO][child]) {
				check[child] = true;
				dp[NO][root] += dp[YES][child];
			} else {
			// 부하가 불참하는거가 이득이면 부하가 불참한다고 체크
				check[child] = false;
				dp[NO][root] += dp[NO][child];
			}
		}
	}

	private static void traceDfs(int root, int isCome) {
		if (isCome == YES) {
			trace.add(root);
		}

		for (Integer child : adj[root]) {
        	// 상사가 참여면 부하는 무조건 불참
			if (isCome == YES) {
				traceDfs(child, NO);
			} else {
            	// 상사가 불참이면 부하는 참여여부를 보고 참여
				if (check[child]) traceDfs(child, YES);
				else traceDfs(child, NO);
			}
		}
	}
}
🐢 마무리
반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

(백준) 트리 _ 4256  (0) 2022.04.04
(백준) 스크루지 민호 2 _ 12978  (0) 2022.04.01
(백준) 망가진 나무 _ 24232  (1) 2022.03.31
(백준) 프린트전달 _ 23887  (0) 2022.03.30
(백준) 트리의 독립집합 _ 2213  (0) 2022.03.27
'알고리즘/백준' 카테고리의 다른 글
  • (백준) 트리 _ 4256
  • (백준) 스크루지 민호 2 _ 12978
  • (백준) 망가진 나무 _ 24232
  • (백준) 프린트전달 _ 23887
구름뭉치
구름뭉치
구름의 개발일기장
    반응형
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (289) N
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (5) N
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (7)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    레이저
    크로아티아
    마우스
    mx master s3 for mac
    동유럽
    류블라냐
    부다페스트
    마우스 패드
    키보드 손목 받침대
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
(백준) 신년 파티 _ 1623
상단으로

티스토리툴바