1
1

More than 3 years have passed since last update.

【Java】AtCoderのABC-202に参加しました(レート:272→277)。

Last updated at Posted at 2021-05-22

こんばんは。

2021/5/22に、AtCoderのABC-202に参加しました。
レートは以下の通りとなっています。

image.png

C問題まで突破しました。
ただ、B問題が一度TLE、C問題は試行錯誤してしまったのと操作ミスで3回エラーになってしまい減点もあった模様です。
レートは272→277にアップ。しょぼいですね。最高レート(278)を次回は更新したい。

A問題

さいころを3つ振る。
出た目の裏側の数を合計する。

おお、これは簡単だと思い、すぐ解けました。


import java.util.Scanner;

public class Main{

public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  int a = sc.nextInt();
  int b = sc.nextInt();
  int c = sc.nextInt();
  System.out.println((7-a)+(7-b)+(7-c));

}
}

B問題

0,1,6,8,9からなる文字列を、180度回転させた文字列を答える。
つまり6は9になったり、0は0のままだったりし、かつ文字列が逆になります。

ここで、文字列を1つずつif文で判定するロジックにしたところ、TLEになりました。痛恨のミスですね。case文の文法を度忘れしてしまったので・・。
文法、調べなおして書きました。


import java.util.Scanner;

public class Main{

public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  String s = sc.next();
  String scn = "";
  for (int i=0;i<s.length();i++){
    switch(s.charAt(i)){
      case '0':
       scn = "0" + scn;
       break;
      case '1':
       scn = "1" + scn;
       break;
      case '6':
       scn = "9" + scn;
       break;
      case '8':
       scn = "8" + scn;
       break;
      case '9':
       scn = "6" + scn;
       break;
     }
  }
  System.out.println(scn);

}
}

C問題

Nこの文字列A,B,Cがある。
Ai=Bcjとなる組み合わせを求める。

Aiを読み込み、一個ずつ調べるとTLEになってしまいます。
そこで、値読み込みの時にこのような処理を入れました。

1~N*2の2次元テーブルを用意する。
N=3の時はこんな感じです。

image.png

これは、読み込んだ値がいくつあるかを数えています。

N 3
A 1 2 2
B 3 1 2
C 2 3 2

例えばこんな入力例の場合、こうなります。

image.png

Aは、1が1個、2が2個。
Cでいうと、
c[0]は2、b[2-1]は1なので、1つ目の配列に1加算。
c[1]は3、b[3-1]は2なので、2つ目の配列に1加算
c[2]は2、b[2-1]は1なので、1つ目の配列に1加算
こうやっていくと、この配列を順次読み込み、A*Bを加算していくと組み合わせの数が求められると考えました。

こんなプログラムです。


import java.util.Scanner;

public class Main{

public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  long a[] = new long[n];
  long b[] = new long[n];
  long c[] = new long[n];
  long hai[][] = new long[n][2];
  for (int i=0;i<n;i++){
   a[i] = sc.nextInt();
   hai[(int)(a[i]-1)][0] = hai[(int)(a[i]-1)][0] + 1;
  }
  for (int i=0;i<n;i++){
   b[i] = sc.nextInt();
  }
  for (int i=0;i<n;i++){
   c[i] = sc.nextInt();
    //System.out.println(i);
   hai[(int)(b[(int)(c[i]-1)]-1)][1] = hai[(int)(b[(int)(c[i]-1)]-1)][1] + 1;
  }
  long cnt = 0; 
  for (int i=0;i<n;i++){
    cnt = cnt + hai[i][0]*hai[i][1];
  }
System.out.println(cnt);

}
}


最後に

・エラーが出たときは、値の範囲を超過していないかを確認する。
 C問題ではNの範囲が10^5だったので油断し、int型を使ってしまいました。long型でないとだめですね。

・焦らない。
 c問題の回答を、A問題を選択してエラーという痛恨のミス。気を付けます。

パフォーマンスはいまいちでしたが久々にC問題まで解けていい気分です。最近何をやってもさえないですが、引き続き頑張ります。

1
1
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
1
1