AtCoder Daily Training 2023-10-24 EASY

# 課題

[AtCoder Daily Training 2023-10-14 15:30 Start](https://atcoder.jp/contests/adt_easy_20231024_1)

# A
与えられた整数の先頭に 0 を付け足して 4 桁にしたものを表示する。

```java
import java.util.Collections;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String n = scanner.next();
        scanner.close();
        if (n.length() != 4) {
            n = String.join("", Collections.nCopies(4 - n.length(), "0")) + n;
        }
        System.out.println(n);
    }
}
```

`String#format` などでも大丈夫だと思う。

# B
与えられた文字列から `a, e, i, o, u` を取り除いたものを表示する。

```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        scanner.close();
        s = s.replace("a", "");
        s = s.replace("e", "");
        s = s.replace("i", "");
        s = s.replace("o", "");
        s = s.replace("u", "");
        System.out.println(s);
    }
}
```

ｻﾞ・力業★

# C
2 点間の距離を表示する。
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        List<Integer> distance = new ArrayList<>(List.of(3,1,4,1,5,9));
        List<String> alphabet = new ArrayList<>(List.of("A", "B", "C", "D", "E", "F", "G"));
        Scanner scanner = new Scanner(System.in);
        String num = scanner.nextLine();
        scanner.close();
        
        String P = String.valueOf(num.charAt(0));
        String Q = String.valueOf(num.charAt(2));

        int p = alphabet.indexOf(P);
        int q = alphabet.indexOf(Q);
        int result = distance.subList(Math.min(p, q), Math.max(p, q)).stream().mapToInt(i -> i).sum();
        System.out.println(Math.abs(result));
    }
}

```

1. アルファベットのリストを参照して与えられた文字列のインデックスを取得する。
1. `List#subList` を用いてインデックスに対応する部分の数字を切り出す。
1. `stream` で合計を出す

# D
与えられた文字列の中で `#` が配置されている箇所の
- 開始行
- 終了行
- 開始文字列目
- 終了文字列目

を表示する。

```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        String[] s = new String[10];
        Scanner scanner = new Scanner(System.in);
        int count = 0;
        while (scanner.hasNextLine()) {
            if (count == 10) break;
            s[count] = scanner.nextLine();
            count+=1;
        }
        scanner.close();
        int A = -1;
        int B = -1;
        int C = -1;
        int D = -1;
        int flagA = -1;
        int flagC = -1;
        for (int i=0;i<10;i++) {
            if (s[i].contains("#") && flagA == -1) {
                A = i + 1;
                flagA = 1;
                
                for (int j=0;j<10;j++) {
                    if (String.valueOf(s[i].charAt(j)).equals("#") && flagC == -1) {
                        C = j + 1;
                        flagC = 1;
                    }

                    if (!String.valueOf(s[i].charAt(j)).equals("#") && flagC == 1) {
                        D = (j == C) ? C : j;
                        flagC = 2;
                    }
                }
                if (D == -1) {
                    D = 10;
                    flagC = 2;
                }
            }

            if (!s[i].contains("#") && flagA == 1) {
                B = (i == A) ? A : i;
                flagA = 2;
            }
        }
        if (B == -1 && A != -1) B = 10; 
        System.out.println(A+" "+B);
        System.out.println(C+" "+D);
    }
}
```
 - B = 10 や D = 10 のパターン
 - `#` が 1 文字 or 1 行しか含まれないパターン

に注意

# E
渡されたクエリを都度実行する。


```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = Integer.parseInt(scanner.next());
        int Q = Integer.parseInt(scanner.next());
        Map<Integer, List<Integer>> A = new HashMap<>();
        for (int i=1;i<=N;i++) {
            int a = Integer.parseInt(scanner.next());
            List<Integer> list = A.containsKey(a) ? A.get(a) : new ArrayList<>();
            list.add(i);
            A.put(a, list);
        }
        int[] result = new int[Q];

        for (int i=0;i<Q;i++) {
            int x = Integer.parseInt(scanner.next());
            int k = Integer.parseInt(scanner.next());
            if (A.containsKey(x) && k-1 < A.get(x).size()) {
                result[i] = A.get(x).get(k-1);
            } else {
                result[i] = -1;
            }
        }
        scanner.close();
        for (int i : result) {
            System.out.println(i);
        }
    }    
}
```
思っていた以上に `Map` が速かった。