🤔

Atcoderをやってみる

2024/12/24に公開

前置き

本記事は、みすてむずアドカレ その2の24日目の記事です。

みすてむずアドカレ2024の一覧

なにすんの?

Atcoderします。それだけです。

今回の解答に使用する言語

  • Java
  • C++ 20(gcc 12.2)
  • Python3(CPython 3.11.4)

追加予定

  • (Rust)

問題一覧

AGC003-A "Wanna go back home"

  • 問題の条件を洗い出す
    とりあえず、問題文を見てみて、こんな感じの条件があるな〜と感じました。
    • 好きな分だけ移動させることができる
    • 4方向しか移動する必要がない
      よくよくみてみると...
      正の距離だけ移動します。
      と書いてあるので、どうやら移動距離を0にするのはダメなようです...
  • 実装方針を考える
    ってことは、北に1の距離で50回移動しても、南に50の距離で1回移動すれば無かったことにできるので...
    北と南, 東と西のそれぞれのペアについて、どちらも文字列に登場している、していないが判定できればいけるはず
  • 実装
Java
import java.util.Scanner;  
  
public class AGC003A {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        String s = sc.nextLine();  
        boolean flagN = false,  
                flagW = false,  
                flagS = false,  
                flagE = false;  
        for (char c : s.toCharArray()) {  
            switch (c) {  
                case 'N':  
                    flagN = true;  
                    break;  
                case 'W':  
                    flagW = true;  
                    break;  
                case 'S':  
                    flagS = true;  
                    break;  
                case 'E':  
                    flagE = true;  
                    break;  
            }  
        }  
        if(flagN == flagS && flagW == flagE) {  
            System.out.println("Yes");  
        } else {  
            System.out.println("No");  
        }  
    }  
}
C++
#include<iostream>
#include<string>

int main() {
    std::string s;
    bool flags[4] = {};
    std::cin >> s;
    for(char c: s) {
        if(c=='N') flags[0] = true;
        if(c=='S') flags[1] = true;
        if(c=='W') flags[2] = true;
        if(c=='E') flags[3] = true;
    }
    std::cout << (((flags[0]==flags[1])&&(flags[2]==flags[3]))?"Yes":"No") << std::endl;
    return 0;
}

ABC042-B "文字列大好きいろはちゃんイージー"

  • 問題の条件を洗い出す
    文字列が辞書順ソートされて結合されなければいけない
    ... だけだなこれ()
  • 実装方針を考える
    1. 文字列の個数を受け取って
    2. その分だけ入力
    3. 辞書順ソートして
    4. 結合して出力
  • 実装
Java
import java.util.ArrayList;  
import java.util.List;  
import java.util.Scanner;  
  
public class ABC042B {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        int n = sc.nextInt();  
        int l = sc.nextInt();  
        List<String> _list = new ArrayList<>();  
        for(int i = 0; i < n; i++) _list.add(sc.nextLine());  
        _list.sort(String::compareTo);  
        System.out.println(String.join("", _list));  
    }  
}
Python(一行)
print("".join(list(sorted([input() for _ in range(int(input().split()[0]))]))))

ABC088-B "Card Game for Two"

  • 問題の条件を洗い出す
    順番が考慮されていない、スペース区切りの数字が入ってくる
    ... だけですね
  • 実装方針を考える
    1. 個数を受け取る
    2. その分だけ入力
    3. 降順ソートして
    4. 先頭から偶数番目をアリスに、奇数番目をボブに追加
    5. 差を出力
  • 実装
Java
import java.util.*;  
  
public class ABC088B {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        int n = sc.nextInt();  
        List<Integer> a = new ArrayList<>();  
        for (int i = 0; i < n; i++) {  
            a.add(sc.nextInt());  
        }  
        a.sort(Integer::compareTo);  
        Collections.reverse(a);  
        int alice = 0,  
                bob = 0;  
        for (int i = 0; i < n; i++) {  
            if (i % 2 == 0) {  
                alice += a.get(i);  
            } else {  
                bob += a.get(i);  
            }  
        }  
        System.out.println(alice - bob);  
    }  
}

Discussion