Hatena::Grouptopcoder

hama_DU@TopCoderへの道

2010-03-08[過去問]SRM457(DIV2)

SRM457 div2 第二問(500点)

| SRM457 div2 第二問(500点) - hama_DU@TopCoderへの道 を含むブックマーク はてなブックマーク - SRM457 div2 第二問(500点) - hama_DU@TopCoderへの道

http://www.topcoder.com/stat?c=problem_statement&pm=10696

最初場合分けして行こうと思ったが面倒になったので

愚直に4重ループを使った。分に「?」がついていたら「0」に置き換える。


public class TheTriangleBothDivs {

	public String fix(String time) {
		String hour = time.substring(0, 2);
		String minute = time.substring(3, 5);
		String gmt_flg = time.substring(9, 10);
		String gmt_num = time.substring(10, 11);


		String arr_flg[] = new String[] {"+", "-"};
		int minhour = 24;

		// GMTのプラマイ
		for (String flg : arr_flg) {
			if (!gmt_flg.equals("?") && !gmt_flg.equals(flg)) {
				continue;
			}
			// GMTの値
			for (int gmt = 0 ; gmt <= 9 ; gmt++) {
				if (!gmt_num.equals("?") && (gmt_num.charAt(0) - '0') != gmt) {
					continue;
				}

				// 説明文より、「-0」というGMTは無いのでパス
				if (flg.equals("-") && gmt == 0) {
					continue;
				}

				// 時間の10の位
				for (int h1 = 0 ; h1 <= 2 ; h1++) {
					if (hour.charAt(0) != '?' && (hour.charAt(0) - '0') != h1) {
						continue;
					}
					// 時間の1の位
					for (int h2 = 0 ; h2 <= 9 ; h2++) {
						if (hour.charAt(1) != '?' && (hour.charAt(1) - '0') != h2) {
							continue;
						}

						// 時間が24以上だったらパス
						if (h1 == 2 && h2 >= 4) {
							continue;
						}

						int hourhour = h1 * 10 + h2;
						if (flg.equals("+")) {
							hourhour -= gmt;
						} else {
							hourhour += gmt;
						}

						if (hourhour >= 24) {
							hourhour %= 24;
						} else if (hourhour < 0) {
							hourhour += 24;
						}

						if (hourhour < minhour) {
							minhour = hourhour;
						}
					}
				}
			}
		}

		// 最小値が10以下だったら、先頭に「0」をつける
		if (minhour < 10) {
			hour = "0" + minhour;
		} else {
			hour = String.valueOf(minhour);
		}

		// for minute
		if (minute.charAt(0) == '?') {
			minute = "0" + minute.charAt(1);
		}
		if (minute.charAt(1) == '?') {
			minute = minute.charAt(0) + "0";
		}

		return hour + ":" + minute;
	}
}