Etc/알고리즘

[softeer] 7374

jjuni_96 2024. 7. 18. 22:50
728x90

문제

 

메모리 제약

 

입/출력

 

 

 

문제 분석

단순 구현 문제로 흐름을 따라서 계산하면 될 것 같다.
가로로 돌면서 높이 비교
세로로 돌면서 높이 비교
만약 중간에 0이 나오면 더 작은 수가 없기때문에 중지

 

 

풀이 1

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

public class Main {

    public static void main(String[] args) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(System.in);
        BufferedReader bf = new BufferedReader(inputStreamReader);
        
        // 땅 정보 입력
        int[] ground1 = Arrays.stream(bf.readLine().split(" ")).mapToInt(Integer::new).toArray();
        int[] ground2 = Arrays.stream(bf.readLine().split(" ")).mapToInt(Integer::new).toArray();
        int[] ground3 = Arrays.stream(bf.readLine().split(" ")).mapToInt(Integer::new).toArray();

        // 3 * 3 전체 땅 생성
        int[][] groundInfo = {ground1, ground2, ground3};

        int answer = 9;
        for (int row = 0; row < groundInfo.length; row++) {
            answer = Math.min(Calculate(groundInfo[row]), answer);
            answer = Math.min(Calculate(groundInfo[row]), answer);
            if (answer == 0) {break;}
        }

        for (int col = 0; col < groundInfo.length; col++) {
            // 세로 연산
            int[] makeCol = {groundInfo[0][col], groundInfo[1][col],groundInfo[2][col]};
            answer = Math.min(Calculate(makeCol), answer);
            if (answer == 0) {break;}
        }
        System.out.println(answer);
    }
    public static int Calculate(int[] row) {
        int result = 0;

        int avgVal = Arrays.stream(row).sum()/3;
        
        // 평균과 값과의 차이 계산
        for (int i = 0; i < row.length; i++) {
            result += Math.abs(avgVal-row[i]);
        }

        return result;
    }
}

 

 

 

 

실패

세개의 값 중 몇개가 같은지를 잘못 비교하고 있었다...
해당 로직을 다시 수정해서 제출

 

풀이 2

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

public class Main {

    public static void main(String[] args) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(System.in);
        BufferedReader bf = new BufferedReader(inputStreamReader);
        
        // 땅 정보 입력
        int[] ground1 = Arrays.stream(bf.readLine().split(" ")).mapToInt(Integer::new).toArray();
        int[] ground2 = Arrays.stream(bf.readLine().split(" ")).mapToInt(Integer::new).toArray();
        int[] ground3 = Arrays.stream(bf.readLine().split(" ")).mapToInt(Integer::new).toArray();

        // 3 * 3 전체 땅 생성
        int[][] groundInfo = {ground1, ground2, ground3};

        int answer = 9;
        for (int row = 0; row < groundInfo.length; row++) {
            answer = Math.min(Calculate(groundInfo[row]), answer);
            answer = Math.min(Calculate(groundInfo[row]), answer);
            if (answer == 0) {break;}
        }

        for (int col = 0; col < groundInfo.length; col++) {
            // 세로 연산
            int[] makeCol = {groundInfo[0][col], groundInfo[1][col],groundInfo[2][col]};
            answer = Math.min(Calculate(makeCol), answer);
            if (answer == 0) {break;}
        }
        System.out.println(answer);
    }
    public static int Calculate(int[] row) {
        int result = 0;

        // 같은 값 확인
        int[] delDupRow = Arrays.stream(row).distinct().toArray();
        int rowCount = delDupRow.length;

        switch (rowCount) {
            case 1: // 전부 다 같을때
                result = 0;
                break;
            case 2: // 두개만 같을때
                result = Math.abs(delDupRow[0]-delDupRow[1]);
                break;
            case 3: // 세개 다 다른경우(1,2,3)
                result = 2;
        }
        return result;
    }
}

 

 

성공

 

링크

https://softeer.ai/practice/7374/history?questionType=ALGORITHM

 

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

 

softeer.ai

 

 

728x90
반응형
LIST