【Java】お困り人事のお手伝い!IPアドレスからHOST名を割り当てろ!
mokabuu
mokabuu.com

package com.mokabuu.ManyBranch;
import java.util.ArrayDeque;
import java.util.Queue;
/**
*
* @author mokao 1本丸太があります。これを複数人で切って行きます。 2つに切ってもうきれなくなったら(長さが1になったら)終わりです。
* ただし条件があります。一度に1人が切れるのは1回までで、 複数人で切るためには人数分の丸太が必要です。
*
* なので例えば丸太が8メートルで人員が3人だったら 1回目 8/2 = 4,4 2回目 4/4 = 2,2 4/4 = 2,2 3回目
* 2/2 = 1,1 2/2 = 1,1 2/2 = 1,1 4回目 2/2 = 1,1
*
* 合計4回 が答えになります。 このとき100メートルの丸太を5人で切ったら合計何回で切れますか?
*
*/
public class Main {
private static final int NUMBER_OF_PEOPLE = 5;
private static final int BRANCH = 100;
public static void main(String[] args) {
int cutCounter = 0;
int peopleCounter = 1;
Queue<Integer> queue = new ArrayDeque<Integer>();
queue.offer(BRANCH);
while (queue.peek() != null) {
cutCounter++;
logHeader(cutCounter);
for (int i = 0; i < peopleCounter; i++) {
int branch = queue.poll();
logBody(branch);
int choppedBranch = branch / 2;
if (branch % 2 == 1) {
if (choppedBranch == 1) {
queue.offer(choppedBranch + 1);
} else {
queue.offer(choppedBranch);
queue.offer(choppedBranch + 1);
}
} else {
if (choppedBranch > 1) {
queue.offer(choppedBranch);
queue.offer(choppedBranch);
}
}
if (check(queue, cutCounter)) {
break;
}
}
peopleCounter = countPeople(peopleCounter);
}
}
private static boolean check(Queue<Integer> queue, int cutCounter) {
if (queue.peek() == null) {
logAns(cutCounter);
return true;
}
return false;
}
private static int countPeople(int peopleCounter){
if (peopleCounter >= NUMBER_OF_PEOPLE) {
peopleCounter = NUMBER_OF_PEOPLE;
} else {
peopleCounter++;
}
return peopleCounter;
}
private static void logHeader(int cutCounter) {
System.out.println("/*--------------" + cutCounter
+ "回目--------------*/");
}
private static void logBody(int branch) {
System.out.println(branch);
}
private static void logAns(int cutCounter) {
System.out.println("/*--------------\n" + cutCounter
+ "\n--------------*/");
}
}
制限時間が5分〜10分と短めだったとは言え
メインロジックの部分が流石に汚過ぎたなと反省しました。
ぱっと見メソッド分けをしているように見えつつ
何にも意味が無い分け方をしてしまっているので
スピード勝負で書いても綺麗なコード書けるように精進します。
[adsense]