문제
3차원 좌표공간 위의 8개 점 P_0 = (0,0,0), P_1 = (0,0,1), P_2 = (0,1,0), P_3 = (0,1,1), P_4 = (1,0,0),
P_5 = (1,0,1), P_6 = (1,1,0), P_7 = (1,1,1)을 꼭짓점으로 하는 정육면체 S가 있다.
주어진 네 꼭짓점이 정육면체 S의 한 면 위에 있는지 판정해 보자.
입력
첫째 줄에 테스트 케이스의 개수
T가 주어진다.
( 1 < T < 2000 )
둘째 줄부터 T개의 줄에 걸쳐 정육면체
S의 각 꼭짓점을 의미하는 서로 다른 네 정수
a, b, c, d가 공백으로 구분되어 주어진다.
(0 < a, b, c, d < 8)
출력
각 테스트케이스마다 한 줄에 하나씩
P_a, P_b, P_c, P_d가 정육면체 S의 한 면 위에 있는 네 꼭짓점이면 YES, 그렇지 않으면 NO를 출력한다.
접근
4개의 점이 평면이 되려면, 정육면체의 면 개수는 6개 뿐임으로 순서 상관 없이 6가지 경우의 수 밖에 없다.
평면이 되는 점들의 공통점을 살펴본 뒤 이에 부합하는 경우 YES, 아닌 경우 NO를 출력하게 하였다.
1. (0,0,0) 이 포함된 평면의 경우, 평면을 구성하는 점의 x,y,z의 합은 (0,2,2), (2,0,2), (2,2,0) 이다.
2. (1,1,1) 이 포함된 평면의 경우, 평면을 굿어하는 점의 x,y,z의 합은 (4,2,2), (2,4,2), (2,2,4) 이다.
따라서 평면을 구성하는 점들의 (x,y,z)의 합이 순서 상관없이 (0,2,2) 이거나 (4,2,2) 인 경우 평면이다.
구현
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
/**
* 31945
*/
public class 정육면체의_네_꼭짓점 {
//주어진 점의 좌표
static int[][] POINTERS = {{0,0,0},{0,0,1},{0,1,0},{0,1,1}
,{1,0,0},{1,0,1},{1,1,0},{1,1,1}};
public static boolean isPlane(int[] planes) {
//x,y,z의 합
int[] sum = {0,0,0};
for(int plane : planes) {
int[] point = POINTERS[plane];
for(int i=0;i<3;i++) {
sum[i]+=point[i];
}
}
//0,2,4 의 개수
int count0 = 0;
int count2 = 0;
int count4 = 0;
for(int x:sum) {
if(x==0) count0++;
if(x==2) count2++;
if(x==4) count4++;
}
//2의 개수가 2이고
//0이 하나거나, 4가 하나라면 평면
return count2==2&&(count0==1||count4==1);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0;i<n;i++) {
st = new StringTokenizer(br.readLine());
int[] arr = new int[4];
for(int j=0;j<4;j++) {
arr[j] = Integer.parseInt(st.nextToken());
}
bw.append(isPlane(arr)?"YES\n":"NO\n");
}
bw.close();
br.close();
}
}
'알고리즘' 카테고리의 다른 글
[백준] 31288번: 캬루 Java (2) | 2024.02.06 |
---|---|
[백준] 12789번 : 도키도키 간식드리미 Java (0) | 2023.11.05 |
[백준] 29332번: 보물 지도 JAVA (0) | 2023.09.03 |
[백준] 28682번: 재우야 임관하자 JAVA (0) | 2023.08.19 |
[백준] 28432번: 끝말잇기 JAVA (0) | 2023.08.11 |
댓글