문제 출처: algospot.com/judge/problem/read/DRAWRECT
1. 코드
#include <iostream>
using namespace std;
int main(void)
{
int t;
cin >> t;
while (t--)
{
int arr[4][2]; //좌표 저장 [i][0] = x좌표, [i][1] = y좌표
for (int i = 0; i < 3; i++)
cin >> arr[i][0] >> arr[i][1];
for (int i = 0; i < 3; i++)
{
bool flag1 = true; //x좌표 확인
bool flag2 = true; //y좌표 확인
for (int j = 0; j < 3; j++)
{
if (i == j) continue; //좌표가 동일할 경우 제외
if (arr[i][0] == arr[j][0]) flag1 = false;
if (arr[i][1] == arr[j][1]) flag2 = false;
}
if (flag1) arr[3][0] = arr[i][0];
if (flag2) arr[3][1] = arr[i][1];
}
cout << arr[3][0] << " " << arr[3][1] << endl; //마지막 x좌표와 y좌표 출력
}
}
2. 풀이
문제의 예시 입출력 결과를 살펴보면 x좌표와 y좌표 중 2번 반복하지않은 수가 정답이다. 그렇다면 2번 반복하지 않은 수를 찾아내면 빠르게 해결할 수 있다.
int t;
cin >> t;
while (t--)
테스트 케이스 횟수를 입력받고 그 수만큼 반복해준다.
int arr[4][2]; //좌표 저장 [i][0] = x좌표, [i][1] = y좌표
for (int i = 0; i < 3; i++)
cin >> arr[i][0] >> arr[i][1];
그리고 좌표를 저장할 배열을 생성해주고, 반복문을 통해 좌표의 위치를 저장한다.
for (int i = 0; i < 3; i++)
{
bool flag1 = true; //x좌표 확인
bool flag2 = true; //y좌표 확인
for (int j = 0; j < 3; j++)
{
if (i == j) continue; //좌표가 동일할 경우 제외
if (arr[i][0] == arr[j][0]) flag1 = false;
if (arr[i][1] == arr[j][1]) flag2 = false;
}
if (flag1) arr[3][0] = arr[i][0];
if (flag2) arr[3][1] = arr[i][1];
}
2중 반복문으로 2번 이상 겹치지않는 수를 찾아내려고 하는데 조금 더 쉽게 하기위해 bool형 변수 2개를 사용한다. flag1은 x 좌표의 확인을 flag2는 y 좌표의 확인을 해준다. 그리고 i와 j의 값이 동일하면 같은 위치를 비교하는 것이기에 그것을 제외해주고 다른 경우에는 x와 y좌표가 같으면 bool 형 변수의 값을 true에서 false로 변환시켜준다.
반복문이 끝나고 flag1과 flag2의 값이 true라면 좌표를 저장하는 arr에 해당하는 값을 저장해준다.
cout << arr[3][0] << " " << arr[3][1] << endl; //마지막 x좌표와 y좌표 출력
문제에서 요구한 x 좌표와 y 좌표를 출력해주면 문제는 해결할 수 있다.
'컴퓨터 > 알고스팟 알고리즘' 카테고리의 다른 글
알고스팟 알고리즘: ENCRYPT [C++] (0) | 2021.05.06 |
---|---|
알고스팟: LECTURE [C++] (0) | 2021.05.05 |
알고스팟 알고리즘: ENDIANS [C++] (0) | 2021.05.03 |
알고스팟 알고리즘: MERCY [C++] (0) | 2021.05.02 |
알고스팟(Algospot): 피크닉(PICNIC) [C++] (0) | 2020.11.17 |