
문제
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();
	}
}'알고리즘' 카테고리의 다른 글
| [프로그래머스] [3차] 자동완성 Java (2) | 2025.08.08 | 
|---|---|
| [백준] 31288번: 캬루 Java (2) | 2024.02.06 | 
| [백준] 12789번 : 도키도키 간식드리미 Java (0) | 2023.11.05 | 
| [백준] 29332번: 보물 지도 JAVA (0) | 2023.09.03 | 
| [백준] 28682번: 재우야 임관하자 JAVA (0) | 2023.08.19 | 
 
										
									 
										
									 
										
									 
										
									
댓글