본문 바로가기
Algorythms

백준 1041번 c++

by 준형코딩 2023. 5. 16.

문제

    +---+        
    | D |        
+---+---+---+---+
| E | A | B | F |
+---+---+---+---+
    | C |        
    +---+        

주사위는 위와 같이 생겼다. 주사위의 여섯 면에는 수가 쓰여 있다. 위의 전개도를 수가 밖으로 나오게 접는다.

A, B, C, D, E, F에 쓰여 있는 수가 주어진다.

지민이는 현재 동일한 주사위를 N3개 가지고 있다. 이 주사위를 적절히 회전시키고 쌓아서, N×N×N크기의 정육면체를 만들려고 한다. 이 정육면체는 탁자위에 있으므로, 5개의 면만 보인다.

N과 주사위에 쓰여 있는 수가 주어질 때, 보이는 5개의 면에 쓰여 있는 수의 합의 최솟값을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수는 50보다 작거나 같은 자연수이다.

출력

첫째 줄에 문제의 정답을 출력한다.

예제 입력 1 복사

2
1 2 3 4 5 6

예제 출력 1 복사

36

예제 입력 2 복사

3
1 2 3 4 5 6

예제 출력 2 복사

69

예제 입력 3 복사

1000000
50 50 50 50 50 50

예제 출력 3 복사

250000000000000

예제 입력 4 복사

10
1 1 1 1 50 1

예제 출력 4 복사

500

 

어떤 정육면체이든지 간에 모두 (n이 1과 2일 때 제외)

 

3개의 면 ,2개의 면 ,1개의 면을 가지게 된다.

 

각 면의 총 갯수

 

3개의 면 : 4 

2개의 면 : 4 * (n-1) + 4 * (n-2) ;

1개의 면 : 4 * (n-2) * (n-1) + (n-2)^2

 

 

->

 

3개의 면의 최솟값 : 바라보고 있는 면들의 최솟값들 중 3개의 합 (AF, EB, DC)

2개의 면의 최솟값 : 바라보고 있는 면들의 최솟값들 중 가장 작은 값 2개의 합 (AF, EB, DC)

1개의 면의 최솟값 : 모든 면 값의 최솟값 (AFEBDC중 가장 작은 값)

 

->

 

3개의 면 총갯수 * 3개의 면 최솟값

2개의 면 총갯수 * 2개의 면 최솟값

1개의 면 총갯수 * 1개의 면 최솟값

 

이렇게 모든 면의 값을 구해준 후 다 더해주면 정답이 도출되게 된다.

 

 

 

#include <bits/stdc++.h>
using namespace std;

int n,m;


vector<int>square;
vector<int>temp;
vector<int>temp2;

int main(){


    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    long long int n;
    cin >> n;
    for(int i = 0 ; i < 6 ; i++){
        int a;
        cin >> a;
        square.push_back(a);
        //cout << a <<"\n";
    }

    if(n==1){
        sort(square.begin(),square.end());
        long long int answer=0;
        for(int i = 0 ; i < square.size()-1;i++){
            answer+=square[i];
        }
        cout << answer <<"\n";
    }else{
        temp = square;
        long long int AF = min(square[0],square[5]);
        long long int DC = min(square[3],square[2]);
        long long int EB = min(square[1],square[4]);

        temp2.push_back(AF);
        temp2.push_back(DC);
        temp2.push_back(EB);

        sort(temp.begin(),temp.end());
        sort(temp2.begin(),temp2.end());

        long long int min1=temp[0];
        long long int min2=temp2[0]+temp2[1];
        long long int min3= AF+DC+EB;

        long long int answer =0;
        //cout << "test" <<"\n";

        //cout << min1 << " " << min2 << " " << min3 << "\n";


        answer += min3 * 4;
        //cout << answer << "\n";
        answer += ( (4 * (n-2)) + (4 *(n-1)) ) * min2;
        //cout << answer << "\n";
        answer += ((4 * (n-2)*(n-1)) + pow((n-2),2)) * min1;
        //cout << answer << "\n";


        cout << answer << "\n";


    }
















}

 

 

 

 

 

 

 

참고 

https://lu-coding.tistory.com/11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Algorythms' 카테고리의 다른 글

백준 13560 축구게임 c++  (0) 2023.06.08
백준 10942 팰린드롬? c++  (0) 2023.06.06
9252 LCS 2 c++ 풀이  (0) 2023.04.13
백준 2166 c++  (0) 2023.04.11
백준 2473 c++  (0) 2023.04.11