LoginSignup
0
0

More than 1 year has passed since last update.

ABC002の解答[Java]

Last updated at Posted at 2022-05-16

はじめに

ABC001同様、難易度の割には易しめです(個人の感想)。
絶対もっと良い解答がある気がしますが、私は思いつかないので自分の解答を元に解説していきます。

A - 正直者

問題文はこちら

単純にXとYを比較してif~elseに落とし込みましょう。

A.java
import java.util.*;
class Main{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    //値の受け取り
    int X = sc.nextInt();
    int Y = sc.nextInt();
    //Xの方が大きい?
    if(X>Y) System.out.println(X);
    else	System.out.println(Y);
  }
}

ちなみに、if~elseの部分はこう書き換えても良いでしょう。

A改.java
import java.util.*;
class Main{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    //値の受け取り
    int X = sc.nextInt();
    int Y = sc.nextInt();
    //おっきい方を出力
    System.out.println(Math.max(X,Y));
  }
}

この方が見やすいですね。

B - 罠

問題文はこちら

いろいろなやり方があると思いますが、私は文字列を全部分解して一文字一文字if~elseifで判定しました。

B.java
import java.util.*;
class Main{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    //文字列を一文字ずつ分割してString型配列に格納
    String[] str = sc.next().split("");
    //for文で一文字ずつ見ていく
    for(int i=0;i<str.length;i++){
      //母音か?
      if(str[i].equals("a")||
         str[i].equals("i")||
         str[i].equals("u")||
         str[i].equals("e")||
         str[i].equals("o")
      ){} //母音なら何もしない
      else{
        System.out.print(str[i]); //子音なら改行無しで出力
      }
    }
    System.out.println();  //最後に改行を入れる
  }
}

特に問題はありませんが、String型ではなくchar型でもいい気がします。お好みでどうぞ。

C - 直訴

問題文はこちら

ヒントが書いてあるのでガッツリ数式をプログラムに落とし込みましょう。

C.java
import java.util.*;
class Main{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    //値の受け取り
    int x1 = sc.nextInt();
    int y1 = sc.nextInt();
    int x2 = sc.nextInt();
    int y2 = sc.nextInt();
    int x3 = sc.nextInt();
    int y3 = sc.nextInt();
    //ヒントにあった式をそのまま記述
    System.out.println(Math.abs((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1))/2.0);
  }
}

毎回ヒントくれないすかね。

D - 派閥

問題文はこちら

どうすっかな・・・って思いましたが、boolean型二次元配列で1と2が知り合いならarray[1][2]とarray[2][1]をtrueにすることでメモしていってfor文で全員分回していけば答えが出ます。

D.java
import java.util.*;
class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
        //NとMの受け取り
		int N = sc.nextInt();
		int M = sc.nextInt();
        //各々のつながりを格納するためのboolean型二次元配列の準備
		boolean[][] xy = new boolean[N+1][N+1];
        //forループでM個分受け取る
		for(int i=0;i<M;i++){
			int temp1 = sc.nextInt();
			int temp2 = sc.nextInt();
			xy[temp1][temp2] = true; //「temp1とtemp2が知り合い」
			xy[temp2][temp1] = true; //「temp2とtemp1が知り合い」
		}
        //答え用変数
		int answer = 0;
		for(int i=1;i<xy.length;i++){
            //派閥のメンバーを格納する可変長配列
			ArrayList<Integer> list = new ArrayList<Integer>();
			list.add(i); //最初の人を追加
			for(int j=1;j<xy[i].length;j++){
				if(i==j) continue; //同一人物はスルー
                //iとjは知り合いか?
				if(xy[i][j]){
                    //派閥に入り得るかのboolean型変数の準備
					boolean canFriend = true;
					for(int k=0;k<list.size();k++){
						if(xy[j][list.get(k)]) continue; //jと派閥メンバーは知り合いか?
						canFriend = false; //派閥には入れられない(true→false)
						break;
					}
					if(canFriend)
						list.add(j); //派閥全員と知り合いなら派閥にjを加える
				}
			}
            //派閥の総員数がこれまで試行した派閥より多いならanswer更新
			if(list.size()>answer)
				answer = list.size();
		}
		System.out.println(answer); //答え出力
	}
}

ただ、これって何かアルゴリズムあった気がするんですよね・・・。そっち知っているならその方法で解いた方が良いです。

総評

A:優しい。助かる。
B:まぁまぁ優しい。いろいろやり方ありそう。
C:ヒントがなかったら解くのにちょっと時間かかったかも。
D:アルゴリズムらしい問題。いろいろ試したくなる。
って感じでした。D問題もっと良い解き方あるよな・・・。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0