2477_멜론밭

  • by


▶ 실버 2



입력은 항상 6회 주어지며 전체 사각형 – 작은 사각형 방식으로 면적을 찾습니다.

방향과 길이가 주어지지만, 2회 주어지는 방향이 2개, 1회 주어지는 방향이 2개이다.

두 번 주어진 방향으로 작은 사각형이 있습니다.

ex)

7

4 50

2160

3 30

1 60

3 20

1100년

풀 스퀘어: 50×160

작은 정연한: 60 * 20

전체 사각형은 한 번만 주어진 방향의 길이를 곱하면 좋고,

작은 사각형은 두 번 주어진 방향 중 두 개의 길이를 곱합니다.

따라서, 2회 주어지는 방향과 1회 주어지는 방향을 구별하고,

한번 주어지는 방향 중, 중간에 안는 2개의 길이를 요구한다.

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstring>
#include <map>
using namespace std;

int cnt(4);
bool isDir(4);
vector <pair<int, int>> box;
//vector <pair<int, int>> subArea;
int main(void) {
	ios::sync_with_stdio(NULL);
	cin.tie(0); cout.tie(0);

	
	int k;
	cin >> k;
	for (int i = 0; i < 6; i++) {
		int dir, len;
		//방향과 길이를 입력받고 vector에 입력한다.

cin >> dir >> len; box.push_back({ dir, len }); //두 번 주어지면 true if (isDir(dir - 1) == true) { isDir(dir - 1) = false; } //한 번만 주어지면 false else { isDir(dir - 1) = true; } cnt(dir - 1) += len; } int tmp = 0; int ans = 1; for (int i = 0; i < 6; i++) { //한 번 주어지는 방향의 길이 중 마지막 것의 인덱스를 저장 if (isDir(box(i).first - 1) == true) { if (tmp == 0 && i == 5) { tmp = 6; } else { tmp = i; } //한 번 주어지는 방향의 길이를 곱하면 큰 사각형 ans *= box(i).second; } } int subArea = 1; //가운데 껴 있는 것 중 첫 번째 것이 범위를 넘어간다면 4를 뺀다.

if (tmp + 2 >= 6) { subArea *= box(tmp - 4).second; subArea *= box(tmp - 3).second; } else { subArea *= box(tmp + 2).second; //첫 번째 것이 범위를 넘어가지 않고 두 번째 것이 범위를 넘어간다면 if (tmp + 3 >= 6) { subArea *= box(tmp - 3).second; } //둘 다 범위를 넘어가지 않는다면 else { subArea *= box(tmp + 3).second; } } //전체 사각형 - 작은 사각형에서 k를 곱한 값 출력 cout << k * (ans - subArea) << endl; }