baru003のブログ

baruの雑記兼備忘録

AOJ 0501

・問題リンクData Conversion

・コメント
ゴリ押しというかなんの工夫もなく実装しました.
変換表をMapを使って覚えておき、読み込んだ文字を変換表と比較して行きました.
Javaでchar型を1文字のみの入力として扱う方法が分からなかったのでString型で読み込みそれをchar型に変換できるString#charAtを使っていちいち変換するはめに・・(泣)

・ソース

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class P0501 {

	static Scanner sc = new Scanner(System.in);
	static int n = -1;

	public static void solve() {
		Map<Character, Character> convert = new TreeMap<Character, Character>();
		for (int i = 0; i < n; i++) {
			String before = sc.next();
			String after = sc.next();
			convert.put(before.charAt(0), after.charAt(0));
		}
		int inputCnt = sc.nextInt();
		char[] str = new char[inputCnt];
		for (int i = 0; i < inputCnt; i++) {
			String s = sc.next();
			str[i] = s.charAt(0);
		}
		char[] ans = new char[str.length];
		for (int i = 0; i < str.length; i++) {
			if (convert.containsKey(str[i])) {
				ans[i] = convert.get(str[i]);
			} else {
				ans[i] = str[i];
			}
		}
		System.out.println(ans);
	}

	public static void main(String[] args) {
		while (true) {
			n = sc.nextInt();
			if (n == 0) {
				break;
			}
			solve();
		}
	}

}

AOJ 0160

・問題リンクDelivery Fee

・コメント
ループを回す範囲を間違えるというつまらないミスで1WA出してしまいました・・.
今回も簡潔な考え方をしようとしてハマってしまい余計なアルゴリズムで解こうとしてしまいました..
最終的には一瞬で思いついた考え方でAC出来たのですが、もっと読みやすいコードを書けるように努力したいと思います.
これからなでしこ応援です(笑)

・ソース

import java.util.Scanner;

public class P0160 {

	static Scanner sc = new Scanner(System.in);
	static int totalAmount = 0;

	public static void solve() {
		int[] size = { 161, 160, 140, 120, 100, 80, 60 };
		int[] weight = { 26, 25, 20, 15, 10, 5, 2 };
		int[] fee = { 0, 1600, 1400, 1200, 1000, 800, 600 };
		int tempTotalAmount = fee[0];
		int vertical = sc.nextInt();
		int width = sc.nextInt();
		int height = sc.nextInt();
		int packWeight = sc.nextInt();
		int totalSize = vertical + width + height;
		if (totalSize >= size[0] || packWeight >= weight[0]) {
			return;
		}
		for (int i = 1; i < 7; i++) {
			if (totalSize <= size[i] && packWeight <= weight[i]) {
				tempTotalAmount = fee[i];
			}
		}
		totalAmount += tempTotalAmount;
	}

	public static void main(String[] args) {
		while (true) {
			int totalPackage = sc.nextInt();
			if (totalPackage == 0) {
				break;
			}
			int cnt = totalPackage;
			while (cnt > 0) {
				solve();
				cnt -= 1;
			}
			System.out.println(totalAmount);
			totalAmount = 0;
		}
	}

}

AOJ 0061

・問題リンクRank Checker

・コメント
約1ヶ月ぶりのコーディングとなりました(笑)毎回毎回間が空いてしまって基本的な文法から確認しながら書くはめになり時間がかかってしまいました・・.
ソースもゴリ押しで・・.
はじめに、すべてのチームのランクを一位にしておきました.
そして重複しない正解数のリストを作って、各チームの正解数よりもリストの中に多い正解数があればその数だけランクをインクリメント、つまり順位を下げていくようにして実装しました.
構想自体はすぐに出来たのですが変な先入観で比較の仕方を間違えていてそれに気づけず多くの時間を使うはめに・・(泣)
もっと早く正確にコーディング出来るようになりたいです(切実).

・ソース

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class P0061 {

	static Scanner sc = new Scanner(System.in);
	static Map<Integer, Integer> team = new TreeMap<Integer, Integer>();
	static List<Integer> acceptList = new ArrayList<Integer>();
	static int[] number = new int[1000000];
	static int[] accept = new int[1000000];

	public static void solve() {
		int count = 0;
		while (true) {
			String line = sc.nextLine();
			String[] input = line.split(",");
			number[count] = Integer.parseInt(input[0]);
			accept[count] = Integer.parseInt(input[1]);
			if (number[count] == 0 && accept[count] == 0) {
				break;
			}
			if (acceptList.contains(accept[count]) == false) {
				acceptList.add(accept[count]);
			}
			count++;
		}
		for (int i = 0; i < count; i++) {
			int rank = 1;
			for (int j = 0; j < acceptList.size(); j++) {
				if (accept[i] < acceptList.get(j))
					rank++;
			}
			team.put(number[i], rank);
		}
		output(team);
	}

	public static void output(Map team) {
		while (sc.hasNext()) {
			int entryNumber = sc.nextInt();
			System.out.println(team.get(entryNumber));
		}
	}

	public static void main(String[] args) {
		solve();
	}

}

AOJ 0100

・問題リンクSale Result

・コメント
久しぶりのAOJとなりましたがなんとか一発ACできて一安心です
はじめ、MAPを2つも使わずに解こうと思っていたんですけれどこんな時間で睡魔に負けてしまって妥協してしまっただなんて言えn(ry
無駄な書き方が多いですが、少しずつまたプログラミングに慣れ始めてきたら調整して簡潔でいいコードが書けたらと思います

・ソース

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class P0100 {

	/* mainメソッド */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// データ数:n
		while (true) {
			int n = sc.nextInt();
			if (n == 0) {
				return;
			}
			// key:String,value;LongのMap作成
			Map<String, Long> m = new TreeMap<String, Long>();
			// num[]のインデックス
			int cnt = 0;
			// num[]は社員番号を格納する
			String[] num = new String[n];
			// n入力に対する処理
			while (n > cnt) {
				// 社員番号入力
				num[cnt] = sc.next();
				// 販売単価入力
				long price = sc.nextLong();
				// 売上数量
				long volume = sc.nextLong();
				// すでに知っている社員であったら
				if (m.containsKey(num[cnt])) {
					// 既存の売上金額んい加算して再記憶
					m.put(num[cnt], m.get(num[cnt]) + price * volume);
				}
				// 初めての社員であればそのまま記憶
				else {
					m.put(num[cnt], price * volume);
				}
				// 社員配列インデックスを進める
				cnt++;
			}
			// 一定金額を超えた人がいるかの判定フラグ
			boolean flag = false;
			// 出力した社員番号を覚えておくmapを用意
			Map<String, Long> mapped = new TreeMap<String, Long>();
			// 全社員について見ていく
			for (String x : num) {
				// 社員のトータル売上が条件を満たし、かつ、既出の社員でなければ
				if (m.get(x) >= 1000000 && !mapped.containsKey(x)) {
					// 社員番号を出力
					System.out.println(x);
					// 出力したのでmappedに追加
					mapped.put(x, m.get(x));
					// トータル金額が条件以上の社員がいたのでflagを立てる
					flag = true;
				}
			}
			// フラグが立っていなかったら(条件を満たす社員がいなかったら)
			if (!flag) {
				// NAを出力
				System.out.println("NA");
			}
		}
	}
}

Twitter List Management Tool

今回は、twitterでのリスト管理を簡便にしてくれるサイトやツールなどを紹介したいと思います

twitterのリストは、公式のWebページで編集しようとすると1人1人操作しなければならなく、更には上手く更新されない場合などが多々あるかと思います

そんなリスト管理を容易にしてくれるサイトを見つけました

Twitlistmanager

このサイトでは、フォローと各種リストが表示され、追加したいフォローの追加したいリスト名のチェック・ボックスに✔を入れまとめて保存することでリストへの追加を行なってくれます

リストからの解除は✔を解除して設定を保存すればよいみたいです

icotile (beta)

こちらのサイトさんでは、各アイコンをリストへドラッグ・アンド・ドロップすることによってリストへの追加を行えるインタフェースになっています

とても直感的な操作で行えるのでリスト管理も楽しくできそうですね
こちらも英語仕様のサイトとなっていますが、製作者様は日本の方のようです

他にもいくつかリスト管理簡便化ツールはあるようですが、私が今回使ってみた中で便利だと感じたものをピック・アップしてみました

これでサボりがちなリスト管理も捗りそうです(笑)

AtCoder Regular Contest #004 #A

・問題リンクA - 2点間距離の最大値 ( The longest distance )


・コメント
前回はc++で実装を試みた初参戦のAtCoderでしたが、今回はJavaを使って本コンテストに参加してみました。感想は、前回同様1問しか解くことはできませんでしたが、充実した1時間30分でした。あまりJavaでプログラミングをした経験がなかったので、多少時間もかかってしまいました。問題を解きながらテレビを見てただなんて(ry
実は、B問題にも取り組んではいたのですが手元ですら最小の方の実装ができずそのまま終わってしまいました。次回は、もう1問ACできたらと思います。

・ソース

import java.util.Scanner;

public class A {

	private static double distance(double x1, double y1, double x2, double y2) {
		double dx = x1 - x2;
		double dy = y1 - y2;
		return Math.sqrt(dx * dx + dy * dy);
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		double disx[] = new double[n + 1];
		double disy[] = new double[n + 1];
		// input
		for (int i = 0; i < n; i++) {
			disx[i] = sc.nextDouble();
			disy[i] = sc.nextDouble();
		}
		double dis = distance(disx[0], disy[0], disx[1], disy[1]);
		// calc
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (dis < distance(disx[i], disy[i], disx[j], disy[j])) {
					dis = distance(disx[i], disy[i], disx[j], disy[j]);
				}
			}
		}
		// output
		System.out.println(dis);
	}
}

AOJ 0087

・問題リンクStrange Mathematical Expression

・コメント
久しぶりに自主的にプログラミングをしました。RPNに関しての知識がちょうど入ったばかりだったものでついでに実装してみました。最近は少し忙しくなかなかプログラミングを出来る状態ではないのですが少しずつ続けていけれたらと思います。

・ソース

import java.util.Scanner;
import java.util.Stack;

public class P0087 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		/* 入力の終わりまで読み込む */
		while (sc.hasNext()) {
			/* double型のスタックを用意する */
			Stack<Double> stack = new Stack<Double>();
			/* String型として入力を受け付け,それをスペースで区切って配列に格納する */
			String str[] = sc.nextLine().split(" ");
			/*
			 * 演算子が出てくるまでスタックに格納し 演算子が出てきたらスタックから取り出し演算を行い、 演算結果を再びスタックにしまう
			 */
			int i = 0;
			while (i < str.length) {
				if (str[i].equals("+")) {
					double y = stack.pop();
					double x = stack.pop();
					stack.push(x + y);
				} else if (str[i].equals("-")) {
					double y = stack.pop();
					double x = stack.pop();
					stack.push(x - y);
				} else if (str[i].equals("*")) {
					double y = stack.pop();
					double x = stack.pop();
					stack.push(x * y);
				} else if (str[i].equals("/")) {
					double y = stack.pop();
					double x = stack.pop();
					stack.push(x / y);
				} else {
					stack.push(Double.parseDouble(str[i]));
				}
				i++;
			}
			/* 演算結果を出力して終了 */
			System.out.println(stack.pop());
		}
	}
}