1. 상규, 재동 ¶
- 첫번째 풀때가 1시간쯤 걸렸고 2번째 풀때는 35분쯤 걸렸습니다. 두번째 풀때는 전보다 좋은 알고리즘이 떠올랐습니다.
~cpp
#include <iostream>
using namespace std;
struct POINT
{
int x, y;
};
int numOfData;
POINT inputData[10][4];
int outputData[10];
#define max(a,b) (a > b) ? a : b
#define min(a,b) (a < b) ? a : b
void input()
{
cin >> numOfData;
for(int i=0;i<numOfData;i++)
{
for(int j=0;j<4;j++)
{
cin >> inputData[i][j].x;
cin >> inputData[i][j].y;
}
}
}
void process()
{
POINT maxPoint, minPoint;
int overlappedRect;
for(int i=0;i<numOfData;i++) {
maxPoint.x = max(inputData[i][0].x,inputData[i][2].x);
maxPoint.y = max(inputData[i][0].y,inputData[i][2].y);
minPoint.x = min(inputData[i][1].x,inputData[i][3].x);
minPoint.y = min(inputData[i][1].y,inputData[i][3].y);
overlappedRect = (minPoint.x - maxPoint.x) * (minPoint.y - maxPoint.y);
if(overlappedRect < 0) overlappedRect = 0;
outputData[i] = (inputData[i][1].x - inputData[i][0].x) * (inputData[i][1].y - inputData[i][0].y);
outputData[i] -= overlappedRect;
}
}
void output()
{
for(int i=0;i<numOfData;i++)
{
cout << outputData[i] << endl;
}
}
void main()
{
input();
process();
output();
}
2. 인수 ¶
- 한 두시간은 걸린거 같다
; 문제를 제대로 읽어보지 않은 탓이다. 무슨 찌그러진 사각형을 생각하다니; 미친거 아닌가 모르겠다.
- 이건 시간 생각안하고, 열심히 디자인 해볼라고 노력했는데.. 아무래도 경시대회에선 별루 좋은 방법 같진 않다. 속도 높이는데 중점을 둬야겠다.
~cpp
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
struct Point
{
int x;
int y;
Point(int arg_x, int arg_y)
{
x = arg_x;
y = arg_y;
}
};
class Line
{
public :
int x1;
int y1;
int x2;
int y2;
bool IsVertical()
{
return x1 == x2;
}
bool IsHorizontal()
{
return y1 == y2;
}
bool IsSameVerticalLine(Line& line)
{
return line.x1 == x1;
}
bool IsSameHorizontalLine(Line& line)
{
return line.y1 == y1;
}
Line() {}
Line(int arg_x1, int arg_y1, int arg_x2, int arg_y2)
: x1(arg_x1), y1(arg_y1), x2(arg_x2), y2(arg_y2) {}
bool IsHorizontalCrossVertical(Line& line)
{
return line.y1 >= y1 && line.y1 <= y2 && x1 >= line.x1 && x1 <= line.x2;
}
bool IsVerticalCrossHorizontal(Line& line)
{
return line.x1 >= x1 && line.x1 <= x2 && y1 >= line.y1 && y1 <= line.y2;
}
bool IsMeet(Line& line)
{
if(IsVertical())
{
if( IsSameVerticalLine(line) || IsHorizontalCrossVertical(line) )
return true;
return false;
}
else
{
if( IsSameHorizontalLine(line) || IsVerticalCrossHorizontal(line) )
return true;
return false;
}
return false;
}
};
class Rect
{
public :
int x1;
int y1;
int x2;
int y2;
vector<Point> intersections;
Line GenerateLine(int nth)
{
switch(nth)
{
case 0:
return Line(x1, y1, x2, y1);
case 1:
return Line(x2, y1, x2, y2);
case 2:
return Line(x1, y2, x2, y2);
case 3:
return Line(x1, y1, x1, y2);
default:
return Line(x1, y1, x1, y1);
}
}
bool IsHeapUp()
{
return intersections.size() == 2;
}
bool IsSmallerThan(Rect& rect)
{
return rect.x2 >= x2;
}
void AddIntersectionPoint(Line& rect1Line, Line& rect2Line)
{
if(rect1Line.IsVertical())
intersections.push_back( Point(rect1Line.x1, rect2Line.y1) );
else
intersections.push_back( Point(rect2Line.x1, rect1Line.y1) );
}
Rect(int arg_x1, int arg_y1, int arg_x2, int arg_y2)
: x1(arg_x1), y1(arg_y1), x2(arg_x2), y2(arg_y2) {}
void CountIntersectionPoint(Rect& rect)
{
Line rect1Line, rect2Line;
for(int i = 0 ; i < 4 ; ++i)
{
rect1Line = GenerateLine(i);
for(int j = 0 ; j < 4 ; ++j)
{
rect2Line = rect.GenerateLine(j);
if( rect1Line.IsMeet(rect2Line) )
{
AddIntersectionPoint(rect1Line, rect2Line);
}
}
}
}
int GetRestSquare(Rect& rect)
{
int intersectionSquare = 0;
if( IsHeapUp() )
{
intersectionSquare = abs(intersections[1].x - intersections[0].x)
* abs(intersections[1].y - intersections[0].y);
}
else
{
if( IsSmallerThan(rect) )
intersectionSquare = (x2-x1) * (y2-y1);
else
intersectionSquare = (rect.x2-rect.x1) * (rect.y2-rect.y1);
}
return (x2-x1) * (y2-y1) - intersectionSquare;
}
};
int main()
{
Rect rect1(2,2,4,4);
Rect rect2(1,1,5,5);
rect1.CountIntersectionPoint(rect2);
cout << rect1.GetRestSquare(rect2);
return 0;
}
3. 창섭 ¶
- 으흐.. 마지막에 이렇게 기가 막힌 알고리즘을 왜 생각지 못했을까 하며 통탄했었다. 아직 A 만 풀었지만.. C++ 이라고는 하지만 사실항 C 인거 같다.쩝.. 아무튼 내가 짜고도 알고리즘의 간단함에 놀라움을 금치 못했다. 다만 엄청난 삽질을 하고서 생각났다는게 어안이 벙벙할 뿐이다. 다른거 생각하기 귀찮아서 전부 전역변수로 넣어버린 것도 부끄럽다.
- STL 을 공부해둘 걸 하는 후회가 있다. 배열을 쓸 때마다 느끼는 바다...쩝.
~cpp
#include <iostream>
using namespace std;
void input();
int board1Size();
int calDiffSize();
void output();
int jdValue(int a, int b);
void sort(int a[], int size);
int num;
int board1[10];
int diffSize[10];
int x1, x2, x3, x4, y1, y2, y3, y4;
int main()
{
input();
board1Size();
output();
return 0;
}
void input()
{
cin >> num;
for (int i = 0; i < num; i++)
{
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;
diffSize[i] = calDiffSize();
board1[i] = board1Size();
}
}
int board1Size()
{
return (x2 - x1)*(y2 - y1);
}
int calDiffSize()
{
int diffSize;
if (x2 <= x3 || x1 >= x4 || y1 >= y4 || y2 <= y3)
return 0;
int x[4] = {x1, x2, x3, x4};
int y[4] = {y1, y2, y3, y4};
sort(x, 4);
sort(y, 4);
diffSize = jdValue(x[1], x[2]) * jdValue(y[1], y[2]);
return diffSize;
}
void output()
{
for (int i = 0; i < num; i++)
cout << board1[i] - diffSize[i] <<endl;
}
int jdValue(int a, int b)
{
if (a > b)
return b - a;
return a - b;
}
void sort(int a[], int size)
{
for (int k = 0; k < size; k++)
{
for (int i = 0; i < size - 1; i++)
{
if (a[i] > a[i+1])
{
int temp;
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
}
// sort 함수는 #include <algorithm> 한다음
// sort(&a[0], &a[size]); 하면 끝남
// 그리구 jdValue 이거는 절대값 구하는 함수 같은데
// 저것도 #include <cmath> 한다음, abs(값) 하면 끝남
3.1. 상민(neocoin) ¶
하고 보니 영역 체크가 없군요.
뭐, 예제만 통과할려고 했네요. 앗차 위의 소스들을 보니 max, min이 있었지요. 다음에는 까먹지 말아야지..
뭐, 예제만 통과할려고 했네요. 앗차 위의 소스들을 보니 max, min이 있었지요. 다음에는 까먹지 말아야지..~cpp
#include <iostream>
#include <vector>
using namespace std;
struct DataSet{
int underX[2];
int underY[2];
int upperX[2];
int upperY[2];
};
vector< DataSet > datas;
void input(){
int numberOfTestCase =0;
cin >> numberOfTestCase;
for ( int testCaseNum=0;testCaseNum<numberOfTestCase;testCaseNum++){
DataSet data;
for ( int i =0;i<2;i++)
cin >> data.underX[i] >> data.underY[i];
for ( i =0;i<2;i++)
cin >> data.upperX[i] >> data.upperY[i];
datas.push_back(data);
}
}
int getVisibleArea(DataSet& data){
int underArea = ( data.underX[1] - data.underX[0] ) * (data.underY[1]-data.underY[0]);
int x[2];
int y[2];
x[0] = ( data.underX[0] > data.upperX[0] )?data.underX[0]:data.upperX[0];
x[1] = ( data.underX[1] < data.upperX[1] )?data.underX[1]:data.upperX[1];
y[0] = ( data.underY[0] > data.upperY[0] )?data.underY[0]:data.upperY[0];
y[1] = ( data.underY[1] < data.upperY[1] )?data.underY[1]:data.upperY[1];
int overArea = (x[1] - x[0])*(y[1]-y[0]);
return underArea - overArea;
}
void process(){
vector<DataSet>::iterator iter;
for ( iter = datas.begin(); iter != datas.end(); iter++)
cout << getVisibleArea(*iter) << endl;
}
int main(){
input();
process();
return 0;
}










