こんにちは、Kuniです。現在Javaを学習中で、Atcoderでコーディング力を高めているところです。
今回は競プロ典型90問 022 - Cubic Cake(★2)の実装にチャレンジしてみました。
ACのプログラム
Main.java
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
Scanner sc = new Scanner(System.in);
long A = sc.nextLong();
long B = sc.nextLong();
long C = sc.nextLong();
long gcd_abc = gcd(A,gcd(B,C));
long count = A / gcd_abc - 1 + B / gcd_abc - 1 + C / gcd_abc - 1;
System.out.println(count);
}
private static long gcd(long a, long b) {
// ユークリッド互除法にて最大公倍数を算出
return b == 0 ? a : gcd(b, a%b);
}
}
プログラムの方針
今回はA,B,Cとして幅、奥行き、高さを与えられ、それを最低何回の面の切断で立方体にすることができるかを求めるというものでした。
ここでn×n×nの立方体が作れる場合としては、A,B,Cがそれぞれnで割り切れることが必要です。ここで出来る限り少ない回数で立方体を作る場合には出来る限り大きく切ったほうが良いということになります。つまり複数のnの候補の中でも最も大きい、A,B,Cの最大公約数となるnを探せば良い事になります。
そこで最大公約数を返すgcd関数を作成しました。gcd関数の内部では、最大公約数を求める方法であるユークリッドの互除法を行っています。
そして最大公約数が求まった後は、切断の回数を計算します。ここである長さaをある長さbで分ける時の計算方法は(a/b)-1であることから、A,B,Cそれぞれにおいてこちらを計算します。そしてその結果を全て足すと解が求まります。
参考になれば嬉しいです!!