Topcoder SRM 515 div2 medium "RotatedClock"

短針の角度と長針の角度が与えられる.アナログ時計を考える.目盛りは30度ごとに付けられ,数値は付けられていないとき,どこが上かわからないため針の位置がわかっても時間がわからない.このとき,存在し得る時間のうち一番早いものを求める.存在しない文字列の場合は空文字列を返す.

各目盛りごとにそこを上部とみなして時間を求めていく.また一時間は各目盛り30度のなかで分に相当する位置になければ存在し得る時間にならないためその判定を行う.

public class RotatedClock {

	public String getEarliest(int hourHand, int minuteHand) {
		int mh = Integer.MAX_VALUE, mm = Integer.MAX_VALUE;
		for (int i = 0; i < 360; i += 30) {
			int a = (hourHand + i) % 360, b = (minuteHand + i) % 360;
			int h = h(a), m = m(b);
			if (valid(a, b) && (mh > h || mh == h && mm > m)) {
				mh = h;
				mm = m;
			}
		}
		return mh != Integer.MAX_VALUE ? String.format("%02d:%02d", mh, mm)
				: "";
	}

	private int h(int degree) {
		return degree / 30;
	}

	private int m(int degree) {
		return degree / 6;
	}

	private boolean valid(int hourHand, int minuteHand) {
		return (hourHand % 30) * 12 == minuteHand;
	}
}