티스토리 뷰

 

 

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

 

17140번: 이차원 배열과 연산

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

www.acmicpc.net

 

Tip. 처음 배열의 크기는 3x3,  연산을 거듭할수록 배열은 확장됨. 

       A[r][c]를 찾을 수 있을 정도로 배열이 확장되지 않았는데, A[r][c]를 찾으려고하면 런타임에러 발생

 

 

const fs = require('fs');
const input = fs.readFileSync('./dev/stdin').toString().trim().split('\n');
const [r, c, k] = input.shift().split(' ').map(Number);
let Arr = input.map((v) => v.split(' ').map(Number));
let time = 0;

function funnySort(a, b) {
        if (a[1] > b[1]) {
                return 1;
        } else if (a[1] < b[1]) {
                return -1;
        } else {
                return a[0] - b[0];
        }
}
while (time <= 100) {
        if (r - 1 < Arr.length && c - 1 < Arr[0].length && Arr[r - 1][c - 1] == k) {
                console.log(time);
                return;
        }
        time += 1;
        const R = Arr.length;
        const C = Arr[0].length;
        if (R >= C) {
                let length = C;
                Arr = Arr.map((row) => {
                        let numObj = {};

                        for (let i = 0; i < row.length; i++) {
                                const num = row[i];
                                if (num == 0) continue;
                                if (numObj[num]) {
                                        numObj[num] += 1;
                                } else {
                                        numObj[num] = 1;
                                }
                        }

                        const result = Object.entries(numObj)
                                .map((v) => [+v[0], v[1]])
                                .sort(funnySort)
                                .flat(1);
                        length = result.length > length ? result.length : length;
                        if (length > 100) {
                                length = 100;
                        }
                        return result;
                });

                Arr = Arr.map((row) => {
                        if (row.length < length) {
                                while (row.length < length) {
                                        row.push(0);
                                }
                        } else if (row.length > length) {
                                row = row.slice(0, length);
                        }
                        return row;
                });
        } else {
                let tempArr = Array.from(Array(C), () => Array(R).fill(null));
                for (let i = 0; i < R; i++) {
                        for (let j = 0; j < C; j++) {
                                tempArr[j][i] = Arr[i][j];
                        }
                }

                let length = R;
                tempArr = tempArr.map((row) => {
                        let numObj = {};

                        for (let i = 0; i < row.length; i++) {
                                const num = row[i];
                                if (num == 0) continue;
                                if (numObj[num]) {
                                        numObj[num] += 1;
                                } else {
                                        numObj[num] = 1;
                                }
                        }

                        const result = Object.entries(numObj)
                                .map((v) => [+v[0], v[1]])
                                .sort(funnySort)
                                .flat(1);
                        length = result.length > length ? result.length : length;
                        if (length > 100) {
                                length = 100;
                        }
                        return result;
                });

                tempArr = tempArr.map((row) => {
                        if (row.length < length) {
                                while (row.length < length) {
                                        row.push(0);
                                }
                        } else if (row.length > length) {
                                row = row.slice(0, length);
                        }
                        return row;
                });

                const newR = tempArr[0].length;
                const newC = tempArr.length;
                Arr = Array.from(Array(newR), () => Array(newC));

                for (let i = 0; i < newR; i++) {
                        for (let j = 0; j < newC; j++) {
                                Arr[i][j] = tempArr[j][i];
                        }
                }
        }
}

console.log(-1);
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함