[백준 2477번 : 참외밭] java 풀이

Elmo·2022년 8월 5일
0

[백준] 알고리즘

목록 보기
26/39

🔔기하1 - 참외밭

생각보다 푸는데 시간이 걸린 문제...실수를 많이 했다.

  • 문제에서는 임의의 한 꼭짓점에서 출발하게한다. 이럴 경우 꼭짓점마다 변의 방향 순서가 달라지므로 따져야할 케이스가 너무 많아진다.

따라서 왼쪽 위 꼭짓점에서 시작하도록 입력받은 변의 방향 순서를 돌리는 것이 중요하다.

왼쪽 위 꼭짓점으로 기준을 정한 이유는 그림을 보면 알 수 있다.

  • 보다시피 1,2,3,4번 모양의 도형이 나올 수 있다. 변의 순서를 한칸씩 앞으로 밀면 임의의 꼭짓점 위치도 바뀐다.
  • 이 4개 도형이 공통으로 가질 수 있는 변의 순서가 3->1이며, 이는 왼쪽 위 꼭짓점에서 반드시 시작해야한다.
  • 따라서 입력받은 변의 순서를 3->1부터 시작하도록 while문으로 한칸씩 밀다보면, 결국 왼쪽 위 꼭짓점에서 출발하게된다.
  • 왼쪽 위 꼭짓점에서 출발하는 변의 순서를 String 변수로 만들고 비교하면 1,2,3,4번 도형 중 어느 것인지 알 수 있다.

참고로 1번 도형만 3->1로 시작하는 경우가 두 가지가 있다. 이를 고려해서 조건문을 작성해야한다.

🔑 java 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());//참외 수 입력
		int side[][] = new int[6][2];//변의 방향과 길이 입력
		for(int i=0; i<6; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine()," ");
			side[i][0]=Integer.parseInt(st.nextToken());
			side[i][1]=Integer.parseInt(st.nextToken());
		}
		while(true) { //왼쪽 위 꼭짓점에서 시작하도록 반시계방향으로 한칸씩 순서를 당긴다.
			if(side[0][0]==3&&side[1][0]==1)
				break;				
			else {
				int tmp[]=side[5];
				side[5]=side[4];
				side[4]=side[3];
				side[3]=side[2];
				side[2]=side[1];
				side[1]=side[0];
				side[0]=tmp;
			}
		}
		int area=0; //넓이
		//변의 방향 순서를 String으로 받는다.
		String sequence = side[0][0]+""+side[1][0]+""+side[2][0]+""+side[3][0]+""+side[4][0]+""+side[5][0];
		if(sequence.compareTo("313142")==0)//1번 도형일 경우
			area = side[4][1]*side[5][1] - side[1][1]*side[2][1];
		else if(sequence.compareTo("314231")==0)//1번 도형일 경우
			area = side[2][1]*side[3][1] - side[0][1]*side[5][1];
		else if(sequence.compareTo("314142")==0)//2번 도형일 경우
			area = side[0][1]*side[5][1] - side[2][1]*side[3][1];
		else if(sequence.compareTo("314242")==0)//3번 도형일 경우
			area = side[0][1]*side[1][1] - side[3][1]*side[4][1];
		else//4번 도형일 경우
			area = side[1][1]*side[2][1] - side[4][1]*side[5][1];
		
		System.out.print(area*N);//넓이 * 참외 수
		br.close();
	}
}
profile
엘모는 즐거워

0개의 댓글