문제
풀이
int n;
cin>>n;
먼저, 1제곱미터에 넓이에 자라는 참외 개수를 변수 n에 받습니다.
vector<pair<int,int>> save;
int big_garo=0,big_sero=0; //큰 사각형의 가로,세로
int big_garo_index,big_sero_index;
int small_a,small_b; //작은 사각형의 두 변
변의 방향(동쪽은 1, 서쪽은 2, 남쪽은 3, 북쪽은 4) + 길이 를 순서대로 저장하기 위해서
벡터변수 save(pair<int,int>를 저장)를 만들어줍니다.
그리고 big_garo는 위 그림으로 따졌을때 160,
big_sero는 50이 들어갈 예정인 변수입니다.
전, 큰 사각형넓이 - 파먹힌 작은 사각형넓이를 해줄것이기 때문에 위와같이 변수를 선언했습니다.
small_a, small_b 는 작은 사각형의 두 변의 길이가 저장될 예정입니다.
for(int i=0; i<6; i++)
{
int a,b;
cin>>a>>b;
save.push_back(make_pair(a,b));
if(a==1 || a==2) //가로 방향
{
if(big_garo<b)
{
big_garo = b;
big_garo_index = i;
}
}
else if(a==3 || a==4) //세로 방향
{
if (big_sero < b)
{
big_sero = b;
big_sero_index = i;
}
}
}
for문을 통해서 변의 방향과 길이를 저장해줍니다.
거기다 추가로, 큰 사각형의 가로, 세로 길이를 저장해주기 위한 if문을 추가해주고,
해당 가로, 세로 변 길이가 등장한 인덱스또한 저장해줍니다.
(인덱스 저장 이유: 작은 사각형의 변 길이를 구하기 위해서)
int big_square = big_garo * big_sero; //큰 사각형 넓이
//작은 사각형 넓이 구하는 부분
if(big_garo_index+3>5)
small_a=save[big_garo_index+3-6].second;
else
small_a=save[big_garo_index+3].second;
if(big_sero_index+3>5)
small_b=save[big_sero_index+3-6].second;
else
small_b=save[big_sero_index+3].second;
int small_square=small_a*small_b;
큰 사각형 넓이를 구하는건 쉽습니다. 앞서 구한 가로x세로 를 해주면 됩니다.
이제 작은 사각형의 넓이를 구하는것이 문제인데,
이떄 앞서 구한 큰 사각형의 가로,세로의 인덱스를 이용합니다.
문제에서, 반드시 반시계방향으로 돌면서 변의 길이를 주고 있으므로,
(ㄱ,┏, ┗, ┛) <==이 중에서 어떤 모양던지에 상관없이
큰 사각형의 가로 인덱스+3 , 큰 사각형의 세로 인덱스+3
을 해주면, 작은 사각형의 두 변의 길이를 얻을 수 있습니다.
이때 인덱스는 0~5까지 있으므로,
만약 +3 해준값이 5를 초과한다면 -6을 해주면 됩니다.
(주의: 큰 사각형의 가로 인덱스+3을 한다고 반드시 작은 사각형의 세로가 아님.
밭 모양에 따라서 세로가 될수도, 가로가 될 수도 있음. 큰 사각형 세로 인덱스+3에도 마찬가지.
변하지 않는 사실은 어쨌거나 작은 사각형의 양 변의 길이를 얻을 수 있다는 것임.)
cout<<(big_square-small_square)*n;
마지막으로, 참외밭 넓이(큰 사각형-작은 사각형) X 1제곱미터당 참외 갯수 를 출력해주면 끝나게 됩니다.
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
vector<pair<int,int>> save;
int big_garo=0,big_sero=0; //큰 사각형의 가로,세로
int big_garo_index,big_sero_index;
int small_a,small_b; //작은 사각형의 두 변
for(int i=0; i<6; i++)
{
int a,b;
cin>>a>>b;
save.push_back(make_pair(a,b));
if(a==1 || a==2) //가로 방향
{
if(big_garo<b)
{
big_garo = b;
big_garo_index = i;
}
}
else if(a==3 || a==4) //세로 방향
{
if (big_sero < b)
{
big_sero = b;
big_sero_index = i;
}
}
}
int big_square = big_garo * big_sero; //큰 사각형 넓이
//작은 사각형 넓이 구하는 부분
if(big_garo_index+3>5)
small_a=save[big_garo_index+3-6].second;
else
small_a=save[big_garo_index+3].second;
if(big_sero_index+3>5)
small_b=save[big_sero_index+3-6].second;
else
small_b=save[big_sero_index+3].second;
int small_square=small_a*small_b;
cout<<(big_square-small_square)*n;
}
최종 코드입니다.
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[C++] 백준-터렛(1002번) (0) | 2022.09.06 |
---|---|
[C++] 백준-택시 기하학(3053번) (0) | 2022.09.05 |
[C++] 백준-직각삼각형(4153번) (0) | 2022.08.31 |
[C++] 백준-네 번째 점(3009번) (0) | 2022.08.30 |
[C++] 백준-직사각형에서 탈출(1085번) (0) | 2022.08.29 |