본문 바로가기
Algorithm/Baekjoon

2477_참외밭

by 모너아링 2023. 3. 12.

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