반응형

문제

www.acmicpc.net/problem/20975

 

20975번: Just Stalling

The first line contains $N$. The second line contains $N$ space-separated integers $a_1,a_2,\ldots,a_N$. The third line contains $N$ space-separated integers $b_1,b_2,\ldots,b_N$. All heights and limits are in the range $[1,10^9]$.

www.acmicpc.net

풀이 및 코드

import java.util.Scanner;

public class Main {

    // USACO Just Stalling JAVA
    // 백준 20975

    /**
     * 4
     * 1 2 3 4
     * 2 4 3 4
     * 예제의 경우
     * 키가 4인 소가 들어갈 수 있는 stall 의 갯수는 2개 (4,4)
     * 키가 3인 소가 들어갈 수 있는 stall 의 갯수는 2개 (4,3)           //4짜리 하나는 키가4인 소가 썼으므로
     * 키가 2인 소가 들어갈 수 있는 stall 의 갯수는 2개 (2, 3||4)       //키가 4인 소가 높이4짜리 한개, 키가 3인 소가 높이3또는4 짜리 한개 사용했으므로.
     * 키가 1인 소가 들어갈 수 있는 stall 의 갯수는 1개
     * <p>
     * 다시 생각해보니 이렇게 계산할 게 아니네.
     * <p>
     * 원래 모든 경우의 수를 생각해보면, 4x3x2x1 로 구할 수 있다.
     * (키가 큰 순서대로 정렬했다고 가정 4,3,2,1 하고)
     * 4 소는 높이가 2,3 인 것을 사용할 수 없고
     * 3 소는 높이가 2 인 것을 사용할 수 없고
     * 2 소는 모두 사용 가능
     * 1 소도 모두 사용 가능
     * 그러므로
     * 4 x 3 x 2 x 1 이 아니라
     * 2 x 2 x 2 x 1            //(4-2) x (3-1) x 2 x 1
     * 로 구하면 되겠다.
     */
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] cows = new int[n];
        int[] stalls = new int[n];
        long answer = 1;

        //cows
        for (int i = 0; i < n; i++) {
            cows[i] = sc.nextInt();
        }

        //stalls
        for (int i = 0; i < n; i++) {
            stalls[i] = sc.nextInt();
        }

        //둘 다 내림차순 (4,3,2,1) 정렬하기
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (cows[j] < cows[j + 1]) {
                    int temp = cows[j];
                    cows[j] = cows[j + 1];
                    cows[j + 1] = temp;
                }
                if (stalls[j] < stalls[j + 1]) {
                    int temp = stalls[j];
                    stalls[j] = stalls[j + 1];
                    stalls[j + 1] = temp;
                }
            }
        }

        //cows[i] 가 들어갈 수 없는 stall 의 갯수들을 구해서 minus 에 넣자
        int[] minus = new int[n];
        for (int i = 0; i < n; i++) {
            int cnt = 0;
            for (int j = 0; j < n; j++) {//i번째 cow 랑 모든 stall 의 높이를 비교하며 못들어가는게 몇개인지 카운트
                if (cows[i] > stalls[j]) {
                    ++cnt;
                }
            }
            minus[i] = cnt;
        }

        //cows[i] 는 minus[i] 갯수만큼의 stall 은 못들어간다.
        //원래 식은 n ... 1 까지 곱하는거지만 n-x...1 까지 곱하면 된다.
        for (int i = n; i > 0; --i) {
            answer *= i - minus[n - i];   //minus[0] ,[1], [2] ... 이므로
        }

        System.out.println(answer);

    }//main

}//class


반응형

'개발 > 알고리즘' 카테고리의 다른 글

[USACO] Teleportation JAVA  (0) 2021.02.25
[USACO] Word Processor JAVA  (0) 2021.02.24
[USACO] Mad Scientist JAVA  (0) 2021.02.23
[USACO] Even More Odd Photos JAVA  (0) 2021.02.23
[USACO] Uddered but not Herd JAVA  (0) 2021.02.23
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기