▶ 실버2
풀이
입력은 항상 6번 주어지고, 전체 사각형 - 작은 사각형의 방식으로 면적을 구한다.
방향과 길이가 주어지는데, 두 번 주어지는 방향이 두 개이고 한 번 주어지는 방향이 두 개이다.
두 번 주어지는 방향에서 작은 사각형이 존재한다.
ex)
7
4 50
2 160
3 30
1 60
3 20
1 100
전체 사각형: 50 * 160
작은 사각형: 60 * 20
전체 사각형은 한 번만 주어지는 방향의 길이를 곱하면 되고,
작은 사각형은 두 번 주어지는 방향 중 가운데 두 길이를 곱하면 된다.
따라서, 두 번 주어지는 방향과 한 번 주어지는 방향을 구분하고,
한 번 주어지는 방향 중 가운데 껴 있는 두 길이를 구한다.
코드
#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;
}
'Algorithm > Baekjoon' 카테고리의 다른 글
11725_트리의 부모 찾기 (0) | 2023.08.04 |
---|---|
11497_통나무 건너뛰기 (0) | 2023.03.16 |
1339_단어 수학 (0) | 2023.03.08 |
1080_행렬 (0) | 2023.03.07 |
1213_팰린드롬 만들기 (0) | 2023.03.05 |