【Java】丸太が1メートルになるまでまっぷたつにし続けよう!


今回のお題
スクリーンショット 2016-03-12 7.44.03


ゴミコード先輩

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分と短めだったとは言え
メインロジックの部分が流石に汚過ぎたなと反省しました。

ぱっと見メソッド分けをしているように見えつつ
何にも意味が無い分け方をしてしまっているので
スピード勝負で書いても綺麗なコード書けるように精進します。


最後まで読んでいただきありがとうございます。もしこの記事を気に入って頂けたようであればシェアをお願い致します。非常に励みになります。


コメントを残す