[S/W 문제해결 기본] 1일차 - Flatten

soluinoon·2022년 10월 25일
0

알고리즘 저지

목록 보기
2/13
post-custom-banner

1. 문제정보

1.1 링크

문제링크
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV139KOaABgCFAYh

1.2 문제요약

역시 D3 인데 간단합니다. 제일 높은 것을 찾고, 제일 낮은 것을 찾은 뒤에 더하고 빼주면 됩니다.

2. 문제풀이

2.1 접근법

2.1.1 평탄화

public static void flatten(int dump, int[] boxes) {
        int index_big = getBigIndex(boxes);
        int index_small = getSmallIndex(boxes);
        int gap = boxes[index_big] - boxes[index_small];
         
        if (dump == 0) {
            System.out.println(gap);
            return;
        }
        if (gap == 1 || gap == 0) {
            System.out.println(gap);
            return;
        }
        boxes[index_big]--;
        boxes[index_small]++;
        flatten(dump - 1, boxes);
    }

가장 큰 곳과 작은 곳에 1더하고 1 빼주면 됩니다. 주의할 점은 주어진 덤프횟수가 끝나기 전에 평탄화가 끝날 수도 있습니다. 이 때를 위해 차이가 1이나 0일 때 출력하도록 했습니다.

2.2 전체코드

import java.util.*;
import java.io.*;
 
class Solution
{
    int res;
     
    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int dump;
        int ans = 0;
        int[] boxes = new int[100];
         
        for(int test_case = 1; test_case <= 10; test_case++)
        {
            dump = Integer.parseInt(br.readLine());
            //System.out.println(dump);
         
            st = new StringTokenizer(br.readLine());
 
            // input
            for (int i = 0; i < 100; i++) {
                boxes[i] = Integer.parseInt(st.nextToken());
            }
           System.out.print("#" + test_case +" ");
            flatten(dump, boxes);
        }
    }
     
    public static void flatten(int dump, int[] boxes) {
        int index_big = getBigIndex(boxes);
        int index_small = getSmallIndex(boxes);
        int gap = boxes[index_big] - boxes[index_small];
         
        if (dump == 0) {
            System.out.println(gap);
            return;
        }
        if (gap == 1 || gap == 0) {
            System.out.println(gap);
            return;
        }
        boxes[index_big]--;
        boxes[index_small]++;
        flatten(dump - 1, boxes);
    }
     
    public static int getBigIndex(int[] boxes) {
        int big = Integer.MIN_VALUE;
        int index = -1;
         
        for (int i = 0 ; i < 100; i++) {
            if (boxes[i] > big) {
                big = boxes[i];
                index = i;
            }
        }
        return index;
    }
     
    public static int getSmallIndex(int[] boxes) {
        int small = Integer.MAX_VALUE;
        int index = -1;
         
        for (int i = 0 ; i < 100; i++) {
            if (boxes[i] < small) {
                small = boxes[i];
                index = i;
            }
        }
        return index;
    }
}

3. 결론

계속 메모리 오류나길래 버퍼리더의 문제인 줄 알았지만, 결국 내 잘못이었다.

profile
수박개 입니다.
post-custom-banner

0개의 댓글