πŸ“‚ μ•Œκ³ λ¦¬μ¦˜_λ¬Έμ œν’€μ΄/BOJ_λ°±μ€€

[λ°±μ€€ BOJ / JAVA] λ©€ν‹°λ²„μŠ€ β…‘ (18869번)

Amenable 2023. 12. 27. 12:49

πŸ“˜ 1. 문제 μ†Œκ°œ

 

18869번: λ©€ν‹°λ²„μŠ€ β…‘

M개의 μš°μ£Όκ°€ 있고, 각 μš°μ£Όμ—λŠ” 1λΆ€ν„° NκΉŒμ§€ λ²ˆν˜Έκ°€ 맀겨진 행성이 N개 μžˆλ‹€. ν–‰μ„±μ˜ 크기λ₯Ό μ•Œκ³  μžˆμ„λ•Œ, κ· λ“±ν•œ 우주의 쌍이 λͺ‡ κ°œμΈμ§€ ꡬ해보렀고 ν•œλ‹€. κ΅¬μ„±μ΄ 같은데 μˆœμ„œλ§Œ λ‹€λ₯Έ 우주의 쌍

www.acmicpc.net

 

πŸ“˜ 2. 풀이

🧡 1. μ’Œν‘œ μ••μΆ•

  문제의 ν¬μΈνŠΈλŠ” μ’Œν‘œ 압좕이닀.

  μ’Œν‘œ μ••μΆ•μ΄λž€ μ’Œν‘œ 값듀을 μž‘μ€ λ²”μœ„μ˜ κ°’μœΌλ‘œ μ••μΆ•ν•˜λŠ” 것이닀. 수의 κ°’에 μƒκ΄€μ—†μ΄ μˆ˜μ˜ λŒ€μ†Œκ΄€κ³„λ§Œ μ•Œλ©΄ λ  λ•Œ μ‚¬μš©ν•  μˆ˜ μžˆλ‹€.

 

  -100, -4, 0, 3, 5000μ΄λΌλŠ” μ’Œν‘œκ°€ μžˆλ‹€κ³  ν•΄λ³΄μž. 이λ₯Ό λ°°μ—΄μ²˜λŸΌ ν‘œμ‹œν•œλ‹€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

-100 ... -4 ... 0 ... 3 ... 5000
쑴재   쑴재   쑴재   쑴재   쑴재

  ν•˜μ§€λ§Œ 압좕을 μ΄μš©ν•˜μ—¬ λŒ€μ†Œκ΄€κ³„λ§Œ νŒŒμ•…ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 ν‘œν˜„ν•  수 μžˆλ‹€.

μ’Œν‘œ μ••μΆ• κ°’ 0 1 2 3 4
μ‹€μ œ κ°’ -1000 -4 0 3 5000

  μ’Œν‘œ 압좕을 μ΄μš©ν•˜μ—¬ 기쑴에 ν•„μš”ν–ˆλ˜ -100 ~ 5000κΉŒμ§€μ˜ 곡간을 0 ~ 4κΉŒμ§€μ˜ κ³΅κ°„μœΌλ‘œ 쀄일 수 μžˆλ‹€.

🧡 2. 풀이

  μ’Œν‘œ 압좕을 μ΄ν•΄ν–ˆλ‹€λ©΄ 문제의 풀이법을 μ‰½κ²Œ 생각할 수 μžˆλ‹€. 두 μš°μ£Όκ°€ κ· λ“±ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ²°κ΅­ μ’Œν‘œ μ••μΆ•λœ 값이 μΌμΉ˜ν•˜λ©΄ λœλ‹€.

  2개의 μš°μ£Όμ— μ†ν•˜λŠ” ν–‰μ„±μ˜ 크기가 각각 '1 3 2', '12 50 31이라고 ν•΄λ³΄μž. 각 우주λ₯Ό μ’Œν‘œ μ••μΆ•ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

  • 1 3 2 β†’ 1 3 2
  • 12 50 31 β†’ 1 3 2

  μ’Œν‘œ μ••μΆ• 값이 κ°™μœΌλ―€λ‘œ κ²°κ΅­ 두 μš°μ£ΌλŠ” κ· λ“±ν•˜λ‹€κ³  ν•  수 μžˆλ‹€.

  μ’Œν‘œ μ••μΆ• κ°’κ³Ό κ· λ“± μš°μ£Όμ— λŒ€ν•œ 이해가 μ–΄λ ΅λ‹€λ©΄ μΈμ ‘ν•œ 값듀을 λΆ€λ“±ν˜Έλ‘œ λ‚˜νƒ€λ‚Έ 경우λ₯Ό 생각해 보자. '< < = >'와 '< < = >'λŠ” κ· λ“± 우주고, '< > >'와 '> < <'λŠ” κ· λ“± μš°μ£Όκ°€ μ•„λ‹ˆλ‹€.

🧡 3. μ‹œκ°„λ³΅μž‘λ„

  μ’Œν‘œ 압좕을 ν•  λ•Œ 이뢄탐색을 μ΄μš©ν•΄μ•Ό ν•œλ‹€. 이뢄 탐색을 μ΄μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν•˜λ‚˜μ˜ 우주의 행성듀을 μ’Œν‘œ μ••μΆ•ν•˜λŠ”λ° N^2의 μ‹œκ°„μ΄ μ†Œμš”λœλ‹€.

  반면 이뢄 탐색을 μ΄μš©ν•˜κ²Œ 되면 NlogN이 μ†Œμš”λœλ‹€. ν–‰μ„±(N개)을 μ΄λΆ„탐색(logN)을 μ΄μš©ν•˜μ—¬ μžμ‹ μ˜ μœ„μΉ˜λ₯Ό μ°Ύμ„ μˆ˜ μžˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

πŸ“˜ 3. μ½”λ“œ

public class Main {

    static int  N, M;
    static int[][] nums, compressedNums;
    static String[] ss;
    static List<Integer>[] sortedNums;

    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        ss = in.readLine().split(" ");
        M = Integer.parseInt(ss[0]);
        N = Integer.parseInt(ss[1]);
        nums = new int[M][N];
        sortedNums = new ArrayList[M];

        for(int i = 0; i < M; i++) {
            Set<Integer> set = new HashSet<>();

            ss = in.readLine().split(" ");
            for(int j = 0; j < N; j++) {
                int num = Integer.parseInt(ss[j]);
                nums[i][j] = num;
                set.add(num);
            }

            // 이뢄탐색을 μœ„ν•œ μ •λ ¬λœ ν–‰μ„± μ €μž₯
            sortedNums[i] = new ArrayList<>(set);
            Collections.sort(sortedNums[i]);
        }

        // μ’Œν‘œ μ••μΆ•
        compressedNums = new int[M][N];
        for(int i = 0; i < M; i++) {
            for(int j = 0; j < N; j++) {
                // 이뢄 탐색 이용
                compressedNums[i][j] = Collections.binarySearch(sortedNums[i], nums[i][j]);
            }
        }

        // 우주의 μ’Œν‘œ μ••μΆ• 값듀을 λΉ„κ΅ν•˜μ—¬ μš°μ£Όκ°€ κ· λ“±ν•œμ§€ ν™•μΈν•œλ‹€
        int cnt = 0;
        for(int i = 0; i < M; i++) {
            for(int j = i + 1; j < M; j++) {
                if(Arrays.equals(compressedNums[i], compressedNums[j]))
                    cnt++;
            }
        }

        System.out.println(cnt);
    }
}