AtCoder ABC 073 A&B&C
2019/05/27
問題名修正
B問題のコードの書き方を修正 int[][]の生成部分
A - September 9
- $mod10$の結果が9かどうか?
private void solveA() {
int numN = nextInt();
while (numN != 0) {
int wk = numN % 10;
if (wk == 9) {
out.println("Yes");
return;
}
numN /= 10;
}
out.println("No");
}
B - Theater
- 同じ席に複数人が座ることはないため、団体の占有している席の総数を調べる
/*
* Streamですべてを組み立てたみた
*/
private void solveB() {
int numN = nextInt();
int[][] wk = Stream.generate(() -> new int[] { nextInt(), nextInt() }).limit(numN).toArray(int[][]::new);
// int[][] wk = IntStream.range(0, numN).collect(() -> new int[numN][2], (t, i) -> {
// t[i][0] = nextInt();
// t[i][1] = nextInt();
// }, (t, u) -> {
// Stream.concat(Arrays.stream(t), Arrays.stream(u)).toArray(int[][]::new);
// });
int res = Arrays.stream(wk).mapToInt(i -> (i[1] - i[0]) + 1).sum();
out.println(res);
}
C - Write and Erase
setを使った解法
- すでに取得していた数値ならremoveする
- まだsetに格納していない数値ならaddする
private void solveC2() {
int numN = nextInt();
long[] wk = LongStream.range(0, numN).map(i -> nextLong()).toArray();
Set<Long> wkSet = new HashSet<Long>();
for (long l : wk) {
if (wkSet.contains(l)) {
wkSet.remove(l);
} else {
wkSet.add(l);
}
}
out.println(wkSet.size());
}
最初に入力を配列にしないで直接処理にまわしてみた。こっちのほうが100ms以上速い。
private void solveC() {
int numN = nextInt();
Set<Long> wkSet = new HashSet<Long>();
for (int i = 0; i < numN; i++) {
long key = nextLong();
if (wkSet.contains(key)) {
wkSet.remove(key);
} else {
wkSet.add(key);
}
}
out.println(wkSet.size());
}