[백준 JAVA] 1033. 칵테일

2024. 7. 16. 14:16·코딩테스트/백준

문제 링크


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

접근 방법


비례식 여러 개를 합치는 문제입니다.

예를 들어 1) A : B = 2 : 3이고 2) A : C = 8 : 6이면 A : B : C = 4 : 6 : 3이 됩니다.

1)의 A와 C 값을 곱하면 12가 되고, 1) 에는 C가 없으므로 8이 됩니다.

곱한 결과값의 최대공약수는 4이므로 4로 나눠주면 3과 2가 됩니다.

1) 에다가 2를 곱해주고, 1)에 C가 없으므로 3을 넣어주면 4 : 6 : 3이 됩니다.

소스 코드


import java.util.*;
import java.io.*;

public class Main {

	static ArrayList<ArrayList<Integer>> arr;
	static int[] answer;
	static int n, visit;

	static int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b);
	}

	static void cocktail(int num, int mul) { // dfs
		answer[num] *= mul;
		visit |= (1 << num);
		
		for (int i : arr.get(num)) {
			if ((visit & (1 << i)) == 0) {
				visit |= (1 << i);
				cocktail(i, mul);
			}
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int a, b, p, q, tmp1, tmp2, div;
		n = Integer.parseInt(br.readLine());
		answer = new int[n];
		arr = new ArrayList<>(n);

		for (int i = 0; i < n; i++) {
			answer[i] = 1;
			arr.add(new ArrayList<>());
		}

		for (int i = 0; i < n - 1; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			a = Integer.parseInt(st.nextToken());
			b = Integer.parseInt(st.nextToken());
			p = Integer.parseInt(st.nextToken());
			q = Integer.parseInt(st.nextToken());

			tmp1 = answer[b] * p;
			tmp2 = answer[a] * q;
			div = gcd(tmp1, tmp2);
			visit = 0;

			cocktail(a, tmp1 / div);
			cocktail(b, tmp2 / div);
			arr.get(a).add(b);
			arr.get(b).add(a);
		}

		for (int i = 0; i < n; i++) {
			System.out.print(answer[i] + " ");
		}
	}
}

코드 설명


입력받은 비율에서 얼마를 곱해야 전에 구한 비례식들과 합칠 수 있는지 계산합니다.
cocktail 메서드를 이용하여 연결된 노드의 비율 값을 재귀적으로 갱신합니다.

그 후에 각 인접리스트에 추가해 줍니다.

'코딩테스트 > 백준' 카테고리의 다른 글

[백준 JAVA] 1753. 최단경로  (0) 2024.08.01
[백준 JAVA] 16472. 고냥이  (0) 2024.07.25
[백준 JAVA] 2824. 최대공약수  (0) 2024.07.11
[백준 JAVA] 14232. 보석 도둑  (0) 2024.07.09
[백준 JAVA] 1456. 거의 소수  (0) 2024.07.03
'코딩테스트/백준' 카테고리의 다른 글
  • [백준 JAVA] 1753. 최단경로
  • [백준 JAVA] 16472. 고냥이
  • [백준 JAVA] 2824. 최대공약수
  • [백준 JAVA] 14232. 보석 도둑
tkxx_ls
tkxx_ls
  • tkxx_ls
    tkxx_ls Story
    tkxx_ls
  • 전체
    오늘
    어제
    • 분류 전체보기 (119) N
      • 코딩테스트 (58) N
        • 백준 (40)
        • 프로그래머스 (18) N
      • 42Seoul (6)
        • libft (6)
      • Github (1)
      • 환경설정 (1)
        • 기타 (4)
        • c & c++ (3)
      • 잡설 (2)
      • CS (7)
        • 네트워크 (2)
        • 강화 학습 (4)
        • 자료구조 (8)
        • 알고리즘 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백트래킹
    구현
    자료구조
    강화학습
    dfs
    알고리즘
    build 재현성
    c++
    java tool chain
    programmers
    Gradle 설정
    gradle java 설정
    java 버전 호환성
    gradle
    백준
    BOJ
    gradle tool chain
    신경망
    cs
    인공지능
    문자열 처리
    java build
    브루트포스
    jdk 버전 관리
    프로그래머스
    머신러닝
    분할정복
    완전탐색
    Java
    Baekjoon
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
tkxx_ls
[백준 JAVA] 1033. 칵테일
상단으로

티스토리툴바