[99클럽 코테 스터디 23일차 TIL] leetcode 2500. Delete Greatest Value in Each Row

말하는 감자·2024년 11월 19일
0
post-thumbnail

99클럽 코테 스터디 23일차 TIL

💙 JAVA 비기너

📌 오늘의 학습 키워드

  • 배열

📌 공부한 내용

📍 오늘의 문제

📍 작성 코드

class Solution {
    public int deleteGreatestValue(int[][] grid) {

         for(int[] row : grid) {
            Arrays.sort(row);
         }

         int answer = 0;

         for(int i=0; i<grid[0].length; i++) {
            int max = 0;
            for(int j=0; j<grid.length; j++) {
                max = (max < grid[j][i]) ? grid[j][i] : max;
            }
            answer += max;
         }

         return answer;
    }
}

📌 오늘의 회고

정수 2차 배열이 주어지면 각 줄에서 가장 큰 숫자들을 배열에서 삭제한다. 이 과정을 모든 요소가 삭제될 때까지 반복하는데 매회 삭제되는 값들 중 가장 큰 수들의 합을 구하면 된다.

이해하는데도 한세월, 푸는데도 한세월이 걸렸다...
힙으로 어떻게든 풀어보고 싶었으나 도저히 안풀려서 감자가 지난 기간 동안 풀었던 문제들을 살피다가 프로그래머스 완주하지 못한 선수 글을 보고 결국 배열 정렬을 통해 풀기로 결심했다.

2차 배열의 각 줄을 정렬한 후 각 줄의 항목끼리 비교하여 최대값max을 구해 answer에 더해줬다. 고민하던 거에 비해 쉬운 코드...

그나저나 실행시간이 9ms로 평균에 비해 꽤 긴 시간이 걸렸다.

프로필 아이콘이 있는 곳이 감자의 위치...
가장 많이 분포되어있는 4ms 코드는 꽤나 복잡하다.

class Solution {
    public int deleteGreatestValue(int[][] grid) {
        int i = 0, j = 0, k = 0, m = grid.length, n = grid[0].length, c = 0;
        
        for (i = 0; i < n; i++) {
            int d = 0;
            for (j = 0; j < m; j++) {
                int a = 0;
                int ai = 0;
                for (k = 0; k < n; k++) {
                    if (grid[j][k] > a) {
                        a = grid[j][k];
                        ai = k;
                    }
                }
                grid[j][ai] = -1;
                d = (a > d) ? a : d;
            }
            c += d;
        }
        return c;
    }
}

여기는 정렬하지 않고 일일이 비교해주는 코드인 것같은데 이게 감자의 코드보다 빠르다니...!!

그럼 3ms 코드는 어떨까?!

class Solution {
    public int deleteGreatestValue(int[][] grid) {

        for (int row = 0; row < grid.length; row++) {   
            Arrays.sort(grid[row]);
        }

        int res = 0;
        for (int col = 0; col < grid[0].length; col++) {
            int max = 0;
            for (int row = 0; row < grid.length; row++) {   
                if (grid[row][col] > max) {
                    max = grid[row][col];
                }
            }
            res += max;
        }

        return res;
    }
}

...에❓😲❓❓
foreach문을 사용하지 않은 거와 삼항연산자가 아닌 if 조건문을 쓴 것밖에 차이가 없는 거 같은데 6ms나 차이가 난다고?? 했는데 알고보니

아...❓❗
중간에 값확인을 위해 넣은 System.out.println(max);이 6ms나 차이나게 한 범인이었다...

이렇게 감자도 3ms에 안착!!
System.out.println()가 확실히 시간을 많이 잡아먹는 녀석이었구나를 알 수 있었다.

profile
나는 말하는 감자다

0개의 댓글