๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/Coding Test

Kakao 2022 Blind Test - Lv3. ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ (Java)

by Edlin 2022. 6. 30.

๋ฌธ์ œ ์š”์•ฝ

๋ฒ”์œ„์™€ degree๊ฐ€ ์ฃผ์–ด์ง€๋ฉด type์— ๋”ฐ๋ผ ๊ฑด๋ฌผ์ด ํŒŒ๊ดด๋˜๊ฑฐ๋‚˜ ํšŒ๋ณต๋œ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ๊ฑด๋ฌผ์˜ ๋‚ด๊ตฌ๋„๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ. 

 

[๋ฌธ์ œ ์„ค๋ช…] 

  • N x M ํฌ๊ธฐ์˜ ํ–‰๋ ฌ ๋ชจ์–‘ ๋งต์ด ์žˆ๋‹ค.
  • ๋‚ด๊ตฌ๋„๋ฅผ ๊ฐ€์ง„ ๊ฑด๋ฌผ์ด ๊ฐ ์นธ๋งˆ๋‹ค ์กด์žฌํ•œ๋‹ค. 
  • type์ด 1์ด๋ฉด degree ๋งŒํผ ๊ฑด๋ฌผ์˜ ๋‚ด๊ตฌ๋„๊ฐ€ ๊ฐ์†Œํ•˜๊ณ , type์ด 2์ด๋ฉด degree ๋งŒํผ ๊ฑด๋ฌผ์˜ ๋‚ด๊ตฌ๋„๊ฐ€ ํšŒ๋ณตํ•œ๋‹ค.
  • ์ตœ์ข…์ ์œผ๋กœ ๊ฑด๋ฌผ์˜ ๋‚ด๊ตฌ๋„๊ฐ€ 0์ดํ•˜์ด๋ฉด ๊ฑด๋ฌผ์€ ํŒŒ๊ดด๋œ๋‹ค.
    • ์ค‘๊ฐ„์— ๊ฑด๋ฌผ์˜ ๋‚ด๊ตฌ๋„๊ฐ€ 0์ดํ•˜์ผ์ง€๋ผ๋„ ๊ณต๊ฒฉ์„ ๋ฐ›์œผ๋ฉด ๋‚ด๊ตฌ๋„๋Š” ๊ณ„์† ๊ฐ์†Œํ•œ๋‹ค.
    • ์ฆ‰, ์ตœ์ข… ๊ฐ’์„ ๊ทผ๊ฑฐ๋กœ ๊ฑด๋ฌผ์€ ํŒŒ๊ดด๋œ๋‹ค. 

 

[์ œํ•œ ์‚ฌํ•ญ]

  1. board(N x M): ๊ฑด๋ฌผ์˜ ๋งต(ํ–‰๊ณผ ์—ด) (1 ≤ ๊ฑด๋ฌผ์˜ ํ–‰(N) or ๊ฑด๋ฌผ์˜ ์—ด(M) ≤ 1,000, 1 ≤ ๊ฑด๋ฌผ์˜ ๋‚ด๊ตฌ๋„ ≤ 1,000
  2. skill: type, ๋ฒ”์œ„, ๊ณต๊ฒฉ or ํšŒ๋ณต ํฌ๊ธฐ(degree) (1 ≤ skill ๋ฐฐ์—ด ํฌ๊ธฐ ≤ 250,000, 1 ≤ degree ≤ 500
board skill result
[[1,2,3],[4,5,6],[7,8,9]] [[1,1,1,2,2,4],[1,0,0,1,1,2],[2,2,0,2,0,100]] 6

 


๋ฌธ์ œ ์ ‘๊ทผ 

  • imos ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ (์œ„ ์ž…์ถœ๋ ฅ์˜ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์„ค๋ช…)
    • ๋ˆ„์ ํ•ฉ ์ด์šฉ 

 

// 22. 06. 29. ์ˆ˜ - ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ - imos algorithm

public class Solution {
    public static void main(String[] args) {
        System.out.println(solution(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
                , new int[][]{{1, 1, 1, 2, 2, 4}, {1, 0, 0, 1, 1, 2}, {2, 2, 0, 2, 0, 100}}));
    }

    public static int solution(int[][] board, int[][] skill) {
        int answer = 0;

        int N = board.length;
        int M = board[0].length;

        // 1. ๋ˆ„์ ํ•ฉ์„ ๋ณด๊ด€ํ•  ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
        int[][] cumulative_map = new int[N+1][M+1];

        // 2. skill ๋ฐฐ์—ด ๊ฐ’์„ ์ฝ์œผ๋ฉฐ ๋ˆ„์ ํ•ฉ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ๋ฒ”์œ„์˜ ์‹œ์ž‘๊ณผ ๋์— degree ๊ฐ’ ์„ธํŒ…ํ•˜๊ธฐ
        for(int i = 0, length = skill.length; i < length; i++) {
            int type = skill[i][0];
            int r1 = skill[i][1];
            int c1 = skill[i][2];
            int r2 = skill[i][3];
            int c2 = skill[i][4];
            int degree = type == 1 ? skill[i][5] * -1 : skill[i][5];

            cumulative_map[r1][c1] += degree;
            cumulative_map[r1][c2+1] += degree * -1;
            cumulative_map[r2+1][c1] += degree * -1;
            cumulative_map[r2+1][c2+1] += degree;
        }

        // 2. ์„ธํŒ…๋œ degree ๊ฐ’ ์ด์šฉํ•˜์—ฌ ๋ˆ„์ ํ•ฉ ํ•ด์ฃผ๊ธฐ - ํ–‰
        for(int r = 0; r <= N; r++) {
            int prior = cumulative_map[r][0];
            for(int c = 1; c <= M; c++) {
                cumulative_map[r][c] += prior;
                prior = cumulative_map[r][c];
            }
        }

        // ์—ด
        for(int c = 0; c <= M; c++) {
            int prior = cumulative_map[0][c];
            for(int r = 1; r <= N; r++) {
                cumulative_map[r][c] += prior;
                prior = cumulative_map[r][c];
            }
        }

        // ์›๋ž˜ ๋ฐฐ์—ด๊ณผ ๋”ํ•ด์ฃผ๊ธฐ
        for(int r = 0; r < N; r++) {
            for(int c = 0; c < M; c++) {
                board[r][c] += cumulative_map[r][c];
                if(board[r][c] > 0) answer++;
            }
        }

        return answer;
    }
}

๋А๋‚€์ 

'ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ'์˜ ๊ฒฝ์šฐ 2์ฐจ์› ๋ฐฐ์—ด์„ ์ผ์ผ์ด ๋ฐฉ๋ฌธํ•˜์—ฌ ๊ฑด๋ฌผ์˜ ๋‚ด๊ตฌ๋„๋ฅผ ๋”ํ•˜๊ณ  ๋นผ์ค€๋‹ค๋ฉด ๋ถ„๋ช… ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด ๋ถ„๋ช…ํ–ˆ๊ธฐ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•ด์•ผ ํ–ˆ๋‹ค. ๊ณต๋ถ€ํ•œ ๊ฒฐ๊ณผ imos ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. imos ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ˆ„์ ํ•ฉ์˜ ๊ฐœ๋…์„ ํ™œ์šฉํ•œ ๊ฐœ๋…์ด๋‹ค. ๊ธฐ์กด์— ์•Œ๊ณ ์žˆ๋˜ ๋ˆ„์ ํ•ฉ์ด๋ž€, 1์ฐจ์› ๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ ๋ฐฐ์—ด์˜ ์ „์ฒด ํ•ฉ์„ ๋”ํ•œ ๊ฒƒ์—์„œ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ์ œ์™ธํ•œ ์นธ์˜ ํ•ฉ์„ ๋”ํ•œ ๊ฐ’์„ ๋นผ์ฃผ๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. ๋ฐ˜๋ฉด, imos ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋งค ๋ฒˆ ๋ˆ„์ ํ•ฉ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ 4์นธ์— ๋ˆ„์ ํ•  ๊ฐ’์„ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์ฃผ์–ด ๋งˆ์ง€๋ง‰์— ์ „์ฒด์ ์œผ๋กœ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ธ ๊ฒƒ์ด๋‹ค. ๋•๋ถ„์— O(N * M * skill์˜ ๊ฐœ์ˆ˜)์—์„œ O(N * M + skill)๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋‚˜๋ˆ ์ฃผ์–ด ํšจ์œจ์„ฑ ๊ฒ€์ฆ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ผญ ๊ธฐ์–ตํ•˜์—ฌ ๋‹ค์Œ ๋ฒˆ์—๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž. 

 

๋ฌธ์ œ ๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/92344
 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ

[[5,5,5,5,5],[5,5,5,5,5],[5,5,5,5,5],[5,5,5,5,5]] [[1,0,0,3,4,4],[1,2,0,2,3,2],[2,1,0,3,1,2],[1,0,1,3,3,1]] 10 [[1,2,3],[4,5,6],[7,8,9]] [[1,1,1,2,2,4],[1,0,0,1,1,2],[2,2,0,2,0,100]] 6

programmers.co.kr

 

๋Œ“๊ธ€