티스토리 뷰

문제 링크

색종이

문제 요약

  • 각각 1~6cm 색종이의 개수를 입력으로 갖는다.
  • 가로, 세로의 길이가 각각 6cm인 판 위에 입력 받은 색종이들을 모두 붙여야 한다.
  • 이 때 필요한 최소한의 판의 개수를 출력하는 문제이다.

조건문

  • 문제가 조금 까다로워 보이지만 조건문만 논리적으로 잘 세워주면 쉽게 풀 수 있다.
  • 6cm : 개수만큼 판의 개수를 늘려주면 된다.
  • 5cm : 한 판마다 1cm 색종이가 11개씩 더 들어갈 수 있다.
  • 4cm : 한 판마다 2cm 색종이가 5개씩 더 들어갈 수 있다.
  • 3cm : 한 판마다 2cm 색종이 1개, 1cm 색종이 5개씩 더 들어갈 수 있다.
  • 2cm : 1cm 4개로 치환된다.
  • 1cm : 한 판마다 36개씩 들어갈 수 있다.

문제 해답


#include <iostream>
using namespace std;

const int SIZE = 6 + 1;
#define SIX 6
#define FIVE 5
#define FOUR 4
#define THREE 3
#define TWO 2
#define ONE 1

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int ans = 0;
    int arr[SIZE];
    for (int i = 1;i < SIZE;i++)
        cin >> arr[i];
    ans += arr[SIX];
    while (arr[FIVE] > 0) {
        arr[FIVE]--;
        arr[ONE] -= 11;
        if (arr[ONE] <= 0) arr[ONE] = 0;
        ans++;
    }
    while (arr[FOUR] > 0) {
        arr[FOUR]--;
        if (arr[TWO] >= 5)
            arr[TWO] -= 5;
        else {
            arr[ONE] -= (5 - arr[TWO]) * 4;
            if (arr[ONE] < 0)
                arr[ONE] = 0;
            arr[TWO] = 0;
        }
        ans++;
    }
    while (arr[THREE] > 0) {
        if (arr[THREE] >= 4) {
            ans += arr[THREE] / 4;
            arr[THREE] %= 4;
            continue;
        }
        else if (arr[THREE] == 3) {
            arr[THREE] = 0;
            if (arr[TWO] >= 1) {
                arr[TWO]--;
                arr[ONE] -= 5;
            }
            else
                arr[ONE] -= 9;
            if (arr[ONE] < 0)
                arr[ONE] = 0;
        }
        else if (arr[THREE] == 2) {
            arr[THREE] = 0;
            if (arr[TWO] >= 3) {
                arr[TWO] -= 3;
                arr[ONE] -= 6;
            }
            else if (arr[TWO] == 2) {
                arr[TWO] = 0;
                arr[ONE] -= 10;
            }
            else if (arr[TWO] == 1) {
                arr[TWO] = 0;
                arr[ONE] -= 14;
            }
            else
                arr[ONE] -= 18;
            if (arr[ONE] < 0)
                arr[ONE] = 0;
        }
        else {
            arr[THREE] = 0;
            if (arr[TWO] >= 5) {
                arr[TWO] -= 5;
                arr[ONE] -= 7;
            }
            else {
                arr[ONE] -= 7 + (5 - arr[TWO]) * 4;
                arr[TWO] = 0;
            }
            if (arr[ONE] < 0) arr[ONE] = 0;
        }
        ans++;
    }
    int val = arr[TWO] * 4 + arr[ONE];
    if (val % 36 == 0)
        ans += val / 36;
    else
        ans += val / 36 + 1;
    cout << ans << endl;
    return 0;
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함