【Java】 AtCoder의 ABC-198에 참가했습니다 (레이트 : 220 → 278).

안녕하세요.

2021/4/11에 AtCoder의 ABC-198에 참가했습니다.
요율은 다음과 같습니다.



히사비사이므로 A, B 문제에 조금 시간이 걸려 버렸습니다.
C문제는 1미스했습니다만, 어떻게든 1시간 정도로 풀었습니다. 자신으로서는 최고입니다.
레이트는 221→278로 갱신! 순위는 3461/7993이었다.

오지 마이너스가 된 분을 되찾아, 최고 레이트를 갱신입니다.
돌아오고 피어오메! \(^-^)/

A 문제



N개의 과자를, A군과 B군으로 나누는 조합을 요구한다. 서로 1개 이상 있는 것이 전제.
여러가지 생각해 이하의 프로그램으로 했습니다만, 과자의 수-1을 출력하면 좋을 뿐이 아닐까 생각됩니다.

예를 들면 n=5(과자 5개)의 경우, A:4개, B:1개···A:1개, B4개, 라고 하는 순서로 조합을 생각해 가면, A군으로 보면, 4 (n-1)~1의 4가지가 된다. 라는 법칙이 있기 때문입니다.
어라? 말로 설명하면 어렵다··.
import java.util.Scanner;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  int na = 1;
  int nb = n-na;
  int cnt = 0;
  if(nb>0){
    cnt++;
  }
  while(nb>0){
    na++;
    nb = n - na;
    if(nb>0){
      cnt++;
    }
  }
  System.out.println(cnt);
}
}

B 문제



정수 N에, 0개 이상의 0을 부여해 회문으로 할 수 있을까?

예를 들어, 1210이면 1개의 0을 부여하면 01210에서 회문이 됩니다.
(그러나 자주 이런 문제를 생각하지 마라 · ·)

<실장>
① 우선은 말미의 제로의 개수를 세는다(회문으로 한다면, 부여하는 제로의 수와 후미의 제로의 수는 같다고 단정).
②말미의 제로의 개수와 같은 만큼, 제로를 부여한 캐릭터 라인을 작성.
③③을 역전시킨 문자열을 작성
④②③ 비교
import java.util.Scanner;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  String n = sc.next();
  String ng = n;
  String nh[] = new String[n.length()];
  int zcnt = 0;
  String zer = "";
  // 0 no kazu check
  for(int i=n.length()-1;i>=0;i--){
     //System.out.println("n.charAt(i) = " + n.charAt(i));
     if(n.charAt(i)=='0'){
       zcnt++;
       zer = zer + "0";       
     }else{    
     break;
     }
  }
  ng = zer + ng;    
  //System.out.println(ng);
  String nkai = "";
  for(int i=ng.length()-1;i>=0;i--){
    nkai = nkai + String.valueOf(ng.charAt(i));
  }  
  //System.out.println(nkai);
  if(ng.equals(nkai)){
  System.out.println("Yes");
  }else{
  System.out.println("No");
  }

}
}

C 문제



2차원 평면상의 원점(0,0)이 스타트. 1보로 진행되는 거리는 r.
좌표 (x, y)로 가려면 최소 몇 걸음입니까?

<실장>
①원점에서 (x, y)까지의 거리는 문제문의 해설에 따르면,
 √x^2 + y^2
된다. 우선 이것을 요구한다.

②1보가 진행되는 거리(r)와 ②를 사용하여 계산.
「②/r」의 계산을 하는 것에.
예를 들면 거리가 5라고 해, r이 2이면, 2.5보이지만, 걸음수는 정수가 아니면 안된다. 그 경우는 장황한 진행 방법(↓이런 녀석)을 하는 것으로 정수의 걸음수로 도달할 수 있다.



「②/r(소수점 반올림)」을 요구하는 것으로 정답에 도착하는 것은.
→ 이것으로 제출하면 3문 에러가 된다. 좋은 선이지만, 아직 뭔가 예외의 고려가 되어 있지 않다고 생각 고민한다.

③「r이 과잉인 경우」의 고려가 되어 있지 않은 것을 깨닫는다.
예를 들면, r=5로, 가고 싶은 좌표가 (1,1)일 때, ②의 계산에서는 1이 되지만, 1보에서는 좌표를 뛰어넘어 버린다. 이 경우는, 1보째와 2보째로 거리를 10으로 하면서 좌표(1,1)에 도달할 수 있도록 조정할 수 있다고 단정. 이 경우 반드시 2보로 도달할 수 있다.
・・역시 문장으로 하면 어렵지만, 이하와 같은 이미지.


import java.util.Scanner;
public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  double r = sc.nextDouble();
  double x = sc.nextDouble();
  double y = sc.nextDouble();
  double xy = (x*x)+(y*y);
  //System.out.println((Math.sqrt(xy)));
  double hosu = ((Math.sqrt(xy)))/r;
  double hosuk = Math.ceil(hosu);
  //System.out.println(hosu);
  //System.out.println(hosuk);
  if(hosu>=1){
  System.out.println((int)hosuk);
  }else{
  System.out.println(2);
  }
}
}

감상



・이번은 C문제가 끝나 나머지 40분 있었기 때문에, D문제에 임해 보았습니다만 역시 어렵다. 빨리 D로 진행하는 레벨이 되고 싶습니다.
・다음은 300을 목표로 노력합니다. 다른 쪽의 기사를 읽으면, 300 이후가 자라 고민하는 일도 많은 것 같습니다. 마음으로 노력하고 싶습니다.

갈색을 목표로 하는 분, 서로 노력합시다!

좋은 웹페이지 즐겨찾기