📌 고정 게시글

📢 공지합니다

이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.

최코딩의 개발

[백준 17140번] 이차원 배열과 연산 본문

코딩테스트/백준

[백준 17140번] 이차원 배열과 연산

seung_ho_choi.s 2025. 6. 9. 19:42
728x90

https://www.acmicpc.net/problem/17140

package implement;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

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

        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int[][] arr = new int[3][3];
        for (int i = 0; i < 3; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 3; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int time = 0;
        while (time <= 100) {
            if (r - 1 < arr.length && c - 1 < arr[0].length && arr[r - 1][c - 1] == k) {
                System.out.println(time);
                return;
            }

            if (arr.length >= arr[0].length) {
                arr = R(arr);
            } else {
                arr = C(arr);
            }

            time++;
        }

        System.out.println(-1);
    }

    private static int[][] R(int[][] arr) {
        int maxCol = 0;
        List<List<Integer>> newRows = new ArrayList<>();

        for (int[] row : arr) {
            Map<Integer, Integer> countMap = new HashMap<>();
            for (int num : row) {
                if (num == 0) continue;
                countMap.put(num, countMap.getOrDefault(num, 0) + 1);
            }

            List<int[]> numCountList = new ArrayList<>();
            for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
                numCountList.add(new int[]{entry.getKey(), entry.getValue()});
            }

            numCountList.sort((a, b) -> {
                if (a[1] != b[1]) return a[1] - b[1]; // count 오름차순
                return a[0] - b[0];                   // 숫자 오름차순
            });

            List<Integer> newRow = new ArrayList<>();
            for (int[] pair : numCountList) {
                newRow.add(pair[0]);
                newRow.add(pair[1]);
            }

            maxCol = Math.max(maxCol, newRow.size());
            newRows.add(newRow);
        }

        maxCol = Math.min(maxCol, 100); // 열 최대 100
        int[][] newArr = new int[arr.length][maxCol];
        for (int i = 0; i < arr.length; i++) {
            List<Integer> row = newRows.get(i);
            for (int j = 0; j < row.size() && j < 100; j++) {
                newArr[i][j] = row.get(j);
            }
        }

        return newArr;
    }

    private static int[][] C(int[][] arr) {
        int maxRow = 0;
        List<List<Integer>> newCols = new ArrayList<>();

        int colLen = arr[0].length;
        for (int j = 0; j < colLen; j++) {
            Map<Integer, Integer> countMap = new HashMap<>();
            for (int i = 0; i < arr.length; i++) {
                if (arr[i][j] == 0) continue;
                countMap.put(arr[i][j], countMap.getOrDefault(arr[i][j], 0) + 1);
            }

            List<int[]> numCountList = new ArrayList<>();
            for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
                numCountList.add(new int[]{entry.getKey(), entry.getValue()});
            }

            numCountList.sort((a, b) -> {
                if (a[1] != b[1]) return a[1] - b[1]; // count 오름차순
                return a[0] - b[0];                   // 숫자 오름차순
            });

            List<Integer> newCol = new ArrayList<>();
            for (int[] pair : numCountList) {
                newCol.add(pair[0]);
                newCol.add(pair[1]);
            }

            maxRow = Math.max(maxRow, newCol.size());
            newCols.add(newCol);
        }

        maxRow = Math.min(maxRow, 100); // 행 최대 100
        int[][] newArr = new int[maxRow][colLen];
        for (int j = 0; j < colLen; j++) {
            List<Integer> col = newCols.get(j);
            for (int i = 0; i < col.size() && i < 100; i++) {
                newArr[i][j] = col.get(i);
            }
        }

        return newArr;
    }
}

 

와 함정이 너무 많고 헷갈렸던 문제이다. 골드4가 아니라 골드1 느낌.... 핵심은 map을 활용해서 숫자를 세면 된다. 

무엇보다 함정이 너무 많아서 탐색을 잘 해야된다.

특히 100의 조건을 잘봐야 된다. 즉 요소들 크기가 100이 넘으면 잘라야 된다. 

 

728x90

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

[백준 17142번] 연구소3  (0) 2025.06.09
[백준 1253번] 좋다  (1) 2025.06.08
[백준 15486번] 퇴사2  (1) 2025.06.07
[백준 17144번] 미세먼지 안녕!  (1) 2025.06.06
[백준 16236번] 아기 상어  (1) 2025.06.05