μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€

[ λ°±μ€€ / BOJ 17140 ] 이차원 λ°°μ—΄κ³Ό μ—°μ‚° ( μžλ°” / JAVA )

KIMHYEYUN 2022. 2. 2. 15:24
λ°˜μ‘ν˜•

[https://www.acmicpc.net/problem/17140](https://www.acmicpc.net/problem/17140

 

17140번: 이차원 λ°°μ—΄κ³Ό μ—°μ‚°

첫째 쀄에 r, c, kκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≤ r, c, k ≤ 100) λ‘˜μ§Έ 쀄뢀터 3개의 쀄에 λ°°μ—΄ A에 λ“€μ–΄μžˆλŠ” μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. λ°°μ—΄ A에 λ“€μ–΄μžˆλŠ” μˆ˜λŠ” 100보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

www.acmicpc.net

문제 μ„€λͺ…

λ°°μ—΄ A : μ²˜μŒμ— 3x3인 λ°°μ—΄, μΈλ±μŠ€λŠ” 1λΆ€ν„° μ‹œμž‘
1μ΄ˆκ°€ μ§€λ‚ λ•Œλ§ˆλ‹€ 연산이 적용됨
πŸ‘‰ Rμ—°μ‚° : λͺ¨λ“  행에 λŒ€ν•΄μ„œ μ •λ ¬ μˆ˜ν–‰, ν–‰μ˜ 개수 >= μ—΄μ˜ 개수
πŸ‘‰ Cμ—°μ‚° : λͺ¨λ“  열에 λŒ€ν•΄μ„œ μ •λ ¬ μˆ˜ν–‰, ν–‰μ˜ 개수 < μ—΄μ˜ 개수

각각의 μˆ˜κ°€ λ‚˜νƒ€λ‚œ 횟수의 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ, κ°™λ‹€λ©΄ μˆ«μžκ°€ μ»€μ§€λŠ” 순으둜 μ •λ ¬ν•΄μ„œ λ°°μ—΄A에 λ„£κΈ°
ν–‰ λ˜λŠ” μ—΄μ˜ 크기가 100이 λ„˜μ–΄κ°€λ©΄, 처음 100κ°œλ§Œβ€ΌοΈ
A[r][c] == kκ°€ λ˜λŠ” μ΅œμ†Œ μ‹œκ°„
100μ΄ˆκ°€ μ§€λ‚˜λ„ kκ°€ λ˜μ§€ μ•ŠμœΌλ©΄ -1 좜λ ₯

문제 풀이

Map<num, cnt> : μˆ«μžλ“€μ˜ 갯수
PriorityQueue<pair> : pair(수, 갯수) μ €μž₯

operating()

1) xLen >= yLen πŸ‘‰ R()
2) xLen < xLen πŸ‘‰ C()

μ½”λ“œ

    import javax.swing.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main_BOJ_17140_이차원_λ°°μ—΄κ³Ό_μ—°μ‚° {

    static class pair implements Comparable<pair>{
        int num;
        int cnt;

        public pair(int num, int cnt) {
            this.num = num;
            this.cnt = cnt;
        }

        @Override
        public int compareTo(pair o) {
            int result = this.cnt - o.cnt;
            if(result == 0)
                result = this.num - o.num;

            return result;
        }
    }

    static int r, c, k;
    static int[][] A = new int[101][101];
    static int xLen = 3, yLen = 3;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());

        r = Integer.parseInt(stringTokenizer.nextToken());
        c = Integer.parseInt(stringTokenizer.nextToken());
        k = Integer.parseInt(stringTokenizer.nextToken());

        for (int i = 1; i <= 3; i++) {
            stringTokenizer = new StringTokenizer(br.readLine());
            for (int j = 1; j <= 3; j++) {
                A[i][j] = Integer.parseInt(stringTokenizer.nextToken());
            }
        }

        System.out.println(solution());

    }

    private static int solution() {
        for (int time = 0; time <= 100; time++) {
            if(A[r][c] == k) return time;

            operating();
        }
        return -1;
    }

    private static void operating() {
        if (xLen >= yLen) {
            for (int i = 1; i <= xLen; i++) R(i);
        } else {
            for (int i = 1; i <= yLen; i++) C(i);
        }

    }

    private static void C(int key) {
        PriorityQueue<pair> pq = new PriorityQueue<>();
        Map<Integer, Integer> map = new HashMap<>();

        for (int i = 1; i <= xLen; i++) {
            if(A[i][key] == 0) continue;
            map.compute(A[i][key], (num, cnt) -> cnt == null ? 1 : cnt + 1);
        }
        map.forEach((k, v) -> pq.add(new pair(k, v)));

        int i = 1;
        while (!pq.isEmpty()) {
            pair p = pq.poll();
            A[i++][key] = p.num;
            A[i++][key] = p.cnt;
        }

        xLen = Math.max(xLen, i);

        while (i <= 99) {
            A[i++][key] = 0;
            A[i++][key] = 0;
        }
    }

    private static void R(int key) {
        PriorityQueue<pair> pq = new PriorityQueue<>();
        Map<Integer, Integer> map = new HashMap<>();

        for (int i = 1; i <= yLen; i++) {
            if(A[key][i] == 0) continue;
            map.compute(A[key][i], (num, cnt) -> cnt == null ? 1 : cnt + 1);
        }
        map.forEach((k, v) -> pq.add(new pair(k, v)));

        int i = 1;
        while (!pq.isEmpty()) {
            pair p = pq.poll();
            A[key][i++] = p.num;
            A[key][i++] = p.cnt;
        }

        yLen = Math.max(yLen, i);

        while(i <= 99){
            A[key][i++] = 0;
            A[key][i++] = 0;
        }

    }
}
728x90
λ°˜μ‘ν˜•