1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | /*점이 3개 주어지면 사각형을 이루는 나머지 한 점을 찾을 수 있다.*/ #include <iostream> #include <string> //string을 사용하기 위해 필요한 헤더 #include <cmath> //제곱근 계산을 하기위해 필요한 헤더 using namespace std; void setPoint(int *x, int *y); //입력받은 내용을 좌표로 변환 int main(){ int count; //테스트케이스의 횟수 double long_distance; //두 점 사이의 거리 중에서 가장 긴거리 int *x = new int[3]; //입력된 좌표를 가지고 있는 배열 int *y = new int[3]; int temp_x = 0; int temp_y = 0; int *result_x; //좌표를 토대로 계산되어 나오는 결과(x좌표) int *result_y; //좌표를 토대로 계산되어 나오는 결과(y좌표) //테스트케이스의 횟수를 입력받는다. cin>>count; result_x = new int[count]; result_y = new int[count]; cin.ignore(); //테스트케이스만큼 반복 for(int i=0;i<count;i++){ setPoint(x, y); //같은 좌표가 있는지 확인 - 혼자만 다른 좌표 찾아내기 for(int j=1;j<3;j++){ if(x[0]==x[j]) temp_x = j; if(y[0]==y[j]) temp_y = j; } if(temp_x==0){ //맨 처음이 다른 좌표이면 result_x[i] = x[0]; } else{ result_x[i] = x[3-temp_x]; } if(temp_y==0){ result_y[i] = y[0]; } else{ result_y[i] = y[3-temp_y]; } //사용한 변수 초기화 temp_x = 0; temp_y = 0; } for(int i=0;i<count;i++){ cout<<result_x[i]<<" "<<result_y[i]<<endl; } //메모리 해제 delete []x; delete []y; delete []result_x; delete []result_y; return 0; } void setPoint(int *x, int *y){ //cout<<"setPoint start!"<<endl; char *insert; //좌표를 입력받을 변수 string point; int int_pointX; //X좌표를 int로 변환한 값을 저장할 변수 int int_pointY; //Y좌표를 int로 변환한 값을 저장할 변수 insert = new char[20]; //임의의 point를 3개 입력받음 for(int i=0;i<3;i++){ //cout<<"for start!"<<endl; fgets(insert, 20, stdin); //공백을 포함하여 입력받음 point = insert; point.pop_back(); int_pointX = (int)atof(point.substr(0, point.find(" ")).c_str()); //문자열인 X좌표를 int형으로 변환 int_pointY = (int)atof(point.substr(point.find(" ")).c_str()); //문자열인 Y좌표를 int형으로 변환 if((int_pointX>0&&int_pointX<1001)&&(int_pointY>0&&int_pointY<1001)){ //좌표가 (1, 1)~(1000, 1000) 사이에 있을 때 x[i] = int_pointX; y[i] = int_pointY; } } delete []insert; } | cs |
지금 머리가 안돌아가서 너무 막 짠것 같음
내일 다시 보고 더 좋은 방법 없나 찾아봐야겠음
내가 찾은 방법은 3개의 좌표중 혼자 다른 좌표를 찾아 넣어주는 방법이었음
직사각형이 뷰포트에 평행하다면 좌표들도 뷰포트에 평행하니까
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | /*점이 3개 주어지면 사각형을 이루는 나머지 한 점을 찾을 수 있다.*/ #include <iostream> #include <string> //string을 사용하기 위해 필요한 헤더 #include <cmath> //제곱근 계산을 하기위해 필요한 헤더 using namespace std; void setPoint(int *x, int *y); //입력받은 내용을 좌표로 변환 int findX(int *x); //x를 찾음 int findY(int *y); //y를 찾음 int main(){ int count; //테스트케이스의 횟수 int *x = new int[3]; //입력된 좌표를 가지고 있는 배열 int *y = new int[3]; int *result_x; //좌표를 토대로 계산되어 나오는 결과(x좌표) int *result_y; //좌표를 토대로 계산되어 나오는 결과(y좌표) //테스트케이스의 횟수를 입력받는다. cin>>count; result_x = new int[count]; result_y = new int[count]; cin.ignore(); //테스트케이스만큼 반복 for(int i=0;i<count;i++){ setPoint(x, y); //같은 좌표가 있는지 확인 - 혼자만 다른 좌표 찾아내기 result_x[i] = findX(x); result_y[i] = findY(y); } for(int i=0;i<count;i++){ cout<<result_x[i]<<" "<<result_y[i]<<endl; } //메모리 해제 delete []x; delete []y; delete []result_x; delete []result_y; return 0; } void setPoint(int *x, int *y){ //cout<<"setPoint start!"<<endl; char *insert; //좌표를 입력받을 변수 string point; int int_pointX; //X좌표를 int로 변환한 값을 저장할 변수 int int_pointY; //Y좌표를 int로 변환한 값을 저장할 변수 insert = new char[20]; //임의의 point를 3개 입력받음 for(int i=0;i<3;i++){ //cout<<"for start!"<<endl; fgets(insert, 20, stdin); //공백을 포함하여 입력받음 point = insert; point.pop_back(); int_pointX = (int)atof(point.substr(0, point.find(" ")).c_str()); //문자열인 X좌표를 int형으로 변환 int_pointY = (int)atof(point.substr(point.find(" ")).c_str()); //문자열인 Y좌표를 int형으로 변환 if((int_pointX>0&&int_pointX<1001)&&(int_pointY>0&&int_pointY<1001)){ //좌표가 (1, 1)~(1000, 1000) 사이에 있을 때 x[i] = int_pointX; y[i] = int_pointY; } } delete []insert; } int findX(int *x){ int same = 0; for(int i=1;i<3;i++){ //같은 원소가 있는 위치 찾기 if(x[0]!=x[i]){ same++; } else break; } return x[2-same]; } int findY(int *y){ int same = 0; for(int i=1;i<3;i++){ //같은 원소가 있는 위치 찾기 if(y[0]!=y[i]){ same++; } else break; } return y[2-same]; } | cs |
문제 제대로 안읽고 풀다가 점구하는 거에서 엄청 힘들었다.
문제를 제대로 읽어야 한다는 교훈을 다시 한번..
임의의 한 점을 구하는 것은 각 x의 배열과 y에 배열에서 겹치지 않는(중복X) 원소를 찾는 방법으로 하였다.
좌표 A B C가 존재한다고 할 때
1. A - B가 중복 : C가 다른 원소
2. A - C가 중복 : B가 다른 원소
3. A - B / A - C 모두 겹치지 않음 : A가 다른 원소
이 세가지 조건 중 하나를 만족하므로 겹치는 횟수(위치)를 찾아 제외시켰다.
처음에는 switch문으로 작성했는데 보니까 각 case와 결과에 대입하는 원소 사이에 규칙이 있길래 없애버리고 바로 return문으로 넣어버렸다.
한 5일 고생한 듯 하다...바보처럼..
'알고스팟 > 튜토리얼' 카테고리의 다른 글
[소스코드/C++] XHAENEUNG (0) | 2016.03.06 |
---|---|
[소스코드/C++] URI (0) | 2016.03.03 |
[소스코드/C++] HOTSUMMER (0) | 2016.03.01 |
[소스코드/C++] CONVERT (0) | 2016.03.01 |
[소스코드/C++] MISPELL (0) | 2016.02.29 |