▶ 실버 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;
}