코딩테스트/BOJ

[BOJ] 2004 조합 0의 개수 - JAVA

5월._. 2022. 7. 29.
728x90

1. 문제

 

2004번: 조합 0의 개수

첫째 줄에 정수 $n$, $m$ ($0 \le m \le n \le 2,000,000,000$, $n \ne 0$)이 들어온다.

www.acmicpc.net


2. 풀이

1.  N! / M!(N-M)!을 구해야하므로 2의 개수, 5의 개수를 각각 구한다.

2.  분모의 2, 5 개수는 플러스, 분자의 2, 5개수는 마이너스한다.

3.  2, 5 개수 중 더 적은 값을 출력한다. 10이 되려면 더 작은 개수에 맞춰야 하기 때문이다.

import java.io.*;
import java.util.*;

public class BOJ_2004_조합0의개수 {
   public static void main(String[] args) throws IOException {
      StringTokenizer st = new StringTokenizer(new BufferedReader(new InputStreamReader(System.in)).readLine());
      long N = Integer.parseInt(st.nextToken());
      long M = Integer.parseInt(st.nextToken());

      int two = 0, five = 0;

      for(long i=2;i<=N;i*=2) {
         if(N!=0) two += N/i;
         if(M!=0 && i<=M) two -= M/i;
         if(N-M != 0 && i<=N-M) two -= (N-M)/i;
      }
      for(long i=5;i<=N;i*=5) {
         if(N!=0) five += N/i;
         if(M!=0 && i<=M) five -= M/i;
         if(N-M != 0 && i<=N-M) five -= (N-M)/i;
      }

      System.out.println(Math.min(two,five));
   }
}

3. 결과

전체 수의 2, 5개수를 각각 구하려니 메모리초과가 났다. 

이후에 본문과 같은 방식을 생각했는데, int의 범위로 충분하지 않아서 / by zero 런타임 에러가 났다. long으로 타입변환하니 해결되었다.

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1922 네트워크 연결 - JAVA  (0) 2022.12.16
[BOJ] 18111 마인크래프트 - JAVA  (0) 2022.12.16
[BOJ] 1965 상자넣기 - JAVA  (0) 2022.07.28
[BOJ] 1735 분수 합 - JAVA  (0) 2022.07.27
[BOJ] 1309 동물원 - JAVA  (0) 2022.07.25

댓글