본문 바로가기
Algorithms/simulation

1208 Flatten

by OKOK 2018. 10. 26.

노란색 상자들이 쌓여 있음

높은 곳에서 낮은 곳으로 옮기는 것. 평탄화.

가장 높은 곳과 낮은 곳의 차이가 최대 1 이내가 된다.

작업 횟수 제한이 있음. 최고점과 최저점의 차이를 반환하는 프로그램 작성 

 

제약사항

가로 길이 항상 100

모든 위치에 높이 1이상 100이하

덤프 횟수 1이상 1000이하로 주어짐

덤프 횟수 이내 평탄화가 완료. 그 때 최고점과 최저점의 높이를 반환한다.

 

입력

총 10개 테케 테케 첫 번째 줄에 덤프 횟수가 주어짐.

다음 줄에 각 상자의 높이 값이 주어짐

 

- 좋은 코드의 기준이 무엇이지
- 이해하기 쉬운 코드
- 베스트는 모르니, 일단 0 에서 이해하고 시작하기

 

#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <malloc.h>
#include <string.h>
#include <math.h>
int heights[101];
int n, i, j, tc = 1, input, count, min, max;

void findmin()
{
    if (heights[min] > 0)
        return;
    for (int i = min + 1; i <= 100; i++)
    {
        if (heights[i] > 0)
        {
            min = i;
            return;
        }
    }
}
void findmax()
{
    if (heights[max] > 0)
        return;
    for (int i = max - 1; i >= 1; i--)
    {
        if (heights[i] > 0)
        {
            max = i;
            return;
        }
    }
}

int main()
{
    freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    for (int t = 1; t <= tc; t++)
    {
        min = 9999, max = -1; // 최소, 최대값 입력
        scanf("%d", &n);
        memset(heights, 0, sizeof(heights)); // height 배열 초기화
        for (i = 1; i <= 100; i++)
        {
            scanf("%d", &input); // 인풋 입력 받음.
            heights[input]++; // 배열의 값들을 입력 받음.
            if (input > max) // 입력이 맥스보다 크면
                max = input; // 오케이 맥스값을 찾기
            else if (input < min) // 민값을 찾기.
                min = input;
        }
        for (i = 0; i < n; i++) // 입력받은 n번 만큼 돌림
        {
            findmin(); findmax(); // 최대와 최소값을 계속 찾음.
            if (min == max)
                break;
            heights[min]--;
            heights[min + 1]++;
            heights[max]--;
            heights[max - 1]++;
        }
        findmin(); findmax();
        printf("#%d %d\n", t, max - min);
    }
    return 0;
}

댓글