atcoder beginner contest 043 振り返り

# A
## 方針
for で回して加算
## コード
```java
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int result = 0;
        for (int i=1;i<=N;i++) {
            result += i;
        }
        System.out.println(result);
    }
}
```

## 感想
等差数列の和の公式を利用すると、計算量が入力された数字に依らないのでそっちを利用した方が良かったかもしれない。

(コード例)
```java
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        System.out.println((N*(1+N))/2);
    }
}
```

# B
## 方針
0, 1 の時はバッファに追加。Bでバッファのサイズが0でないときは最後の要素を削除。
## コード
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        List<String> buffer = new ArrayList<>();
        for (int i=0;i<s.length();i++) {
            String c = String.valueOf(s.charAt(i));
            if (c.equals("0") || c.equals("1")) {
                buffer.add(c);
                continue;
            }
            if (buffer.size() == 0) continue;
            buffer.remove(buffer.size()-1);
        }
        System.out.println(String.join("", buffer));
    }
}
```

# C
## 方針
各値から平均値を引いたものの2乗の総和
## コード
```java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<String> ins = new ArrayList<>();
        while (scanner.hasNextLine()) {
            String s = scanner.nextLine();
            if (s.length() == 0) break;
            ins.add(s);
        }
        int len = Integer.valueOf(ins.get(0));
        String in = ins.get(1);
        List<String> list = new ArrayList<>(Arrays.asList(in.split(" ")));
        List<Integer> iList = new ArrayList<>();
        double average = 0;
        for (String s : list) {
            int i = Integer.valueOf(s);
            average += i;
            iList.add(i);
        }
        average = Math.round(average / len);
        int cost = 0;
        for (Integer i : iList) {
            int temp = (int)Math.pow(i - average,2);
            cost += temp;
        }
        System.out.println(cost);
    }
}
```
## 感想
差の2乗を取る、コストという語がつかわれているところから「値 - 平均」の形であることを早くに察するべきだった。
(`Math.round` を `Math.ceil` と書いてしまい15分ほど溶かした。)

# D
## 方針
立てられなかった
## コード
他の人のACに手を加えたものです。
```java
import java.util.Scanner;
public class Main{
  public static void main(String[]args){
    Scanner scanner = new Scanner(System.in);
    String s = scanner.nextLine();
    if (s.length() <= 2) {
        if (s.charAt(0) == s.charAt(1)) {
            System.out.println("1 2");
            return;
        }
        System.out.println("-1 -1");
        return;
    }

    for (int i=0;i<s.length()-2;i++) {
        char c = s.charAt(i);
        char d = s.charAt(i+1);
        char e = s.charAt(i+2);
        if (c == d || d == e || c == e) {
            System.out.println((i+1)+" "+(i+3));
            return;
        }
    }
    System.out.println("-1 -1");
  }
}
```
## 感想
そもそも問題に対する解釈を間違えていた。実行速度云々の話以前の問題なので、本当にその解釈で合っているのか入力例と照らし合わせ無駄な時間を生まないようにしたい。

与えられた文字列に、長さが2以上かつ過半数の文字が同じである部分文字列が含まれている場合はその始点と終点を、含まれていない場合は `-1 -1` を出力する。

(※正解とされたコードでも例にある `noon` に対して `1 3` を返してくるので混乱する。)