떼닝로그

[Java] Softeer 진정한 효도 (min/max, 그리고 진정한 구린 코드) 본문

Algorithms/Softeer

[Java] Softeer 진정한 효도 (min/max, 그리고 진정한 구린 코드)

떼닝 2024. 11. 1. 14:55

[Java] Softeer 진정한 효도 (min/max, 그리고 진정한 구린 코드)

문제 링크 : https://softeer.ai/practice/7374

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

 

 

기록의 이유...

진정한 구린 코드를 보러 오셨나요? 잘 오셨습니다

 

사실 이 문제 여러 번 틀렸습니다

이유가 뭐냐... 문제를 잘못 읽었기 때문입니다.

 

예시에는 분명 땅을 깎는 것만 나와 있는데,

문제를 다시 읽어보면 땅을 높이는 것도 가능하다 이말입니다

이 허점을 찾으려고 검색하신 분들도 계시겠죠? (제발)

 

그리고 하나 애를 먹었던 게...

min/max 값 구하는 게 너무 어려웠습니다

 

원래 파이썬에서는 그냥 min(변수명, 여러 개도 가능) 이런 식이었는데 자바는 좀 다르네요

 

1. Math.min(a, b) / Math.max(a, b)

두 개의 값을 가지고 비교할 때 사용하면 됩니다.

다만, 두 개 이상의 값은 안됩니다

또한, 변수 안의 값이 list나 array 이런 타입이면 안됩니다.

 

2. 그러면 여러 개의 값들 중에서 min/max를 구하고 싶다면?

2-1. max/min 겹쳐서 여러 번 쓰기.

Math.max(Math.max(a, b), c)

2-2. 새로운 배열 만들어서 그 안의 max/min값 구하기

List<Integer> tmpli = Arrays.asList(a, b, c);

max = Collections.max(tmpli);

 

... 정말 최악이네요

파이썬 만세입니다

하지만 익숙해지면 자바가 좋긴 하겠죠?

 

근데 정말 보면 볼수록 OOP를 위해서라면 이런 자바나 C#을 사용하는 것이 좋아보이기는 합니다

딱 명확하거든요...

물론 파이썬도 하나의 객체지향 언어라고는 하지만,,,

꼼수 부릴 땐 파이썬이 최고, 정석으로 공부하려면 C/C++/Java가 역시 짱인 것 같네요

 

제출 코드 (정답, 지저분함 주의)

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[][] board = new int[3][3];
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                board[i][j] = sc.nextInt();
            }
        }


        int cost = 999;
        for(int i=0;i<3;i++){
            // 가로
            int lowest = 999;
            int highest = 0;
            // System.out.println(lowest);
            for(int j=0;j<3;j++){
                lowest = Math.min(lowest, board[i][j]);
                highest = Math.max(highest, board[i][j]);
            }

            int l_tmpcost = 0;
            int h_tmpcost = 0;
            for(int j=0;j<3;j++){
                l_tmpcost += board[i][j] - lowest;
                h_tmpcost += highest - board[i][j];
                
            }
            cost = Math.min(cost, l_tmpcost);
            cost = Math.min(cost, h_tmpcost);

            // 세로
            lowest = 999;
            highest = 0;
            for(int j=0;j<3;j++){
                lowest = Math.min(lowest, board[j][i]);
                highest = Math.max(highest, board[j][i]);
            }

            l_tmpcost = 0;
            h_tmpcost = 0;
            for(int j=0;j<3;j++){
                l_tmpcost += board[j][i] - lowest;
                h_tmpcost += highest - board[j][i];
                
            }
            cost = Math.min(cost, l_tmpcost);
            cost = Math.min(cost, h_tmpcost);
        }

        System.out.println(cost);

    }
}


부끄럽네요...

Comments