티스토리 뷰

728x90
반응형

문제

 

시골에 있는 태양이의 삼촌 댁에는 커다란 참외밭이 있다. 

문득 태양이는 이 밭에서 자라는 참외가 도대체 몇 개나 되는지 궁금해졌다. 

어떻게 알아낼 수 있는지 골똘히 생각하다가 드디어 좋은 아이디어가 떠올랐다. 

유레카! 1m2의 넓이에 자라는 참외 개수를 헤아린 다음, 참외밭의 넓이를 구하면 비례식을 이용하여 참외의 총개수를 구할 수 있다.

1m2의 넓이에 자라는 참외의 개수는 헤아렸고, 이제 참외밭의 넓이만 구하면 된다. 

참외밭은 ㄱ-자 모양이거나 ㄱ-자를 90도, 180도, 270도 회전한 모양(┏, ┗, ┛ 모양)의 육각형이다. 

다행히도 밭의 경계(육각형의 변)는 모두 동서 방향이거나 남북 방향이었다. 

밭의 한 모퉁이에서 출발하여 밭의 둘레를 돌면서 밭경계 길이를 모두 측정하였다.

 

예를 들어 참외밭이 위 그림과 같은 모양이라고 하자. 

그림에서 오른쪽은 동쪽, 왼쪽은 서쪽, 아래쪽은 남쪽, 위쪽은 북쪽이다. 

이 그림의 왼쪽 위 꼭짓점에서 출발하여, 

반시계방향으로 남쪽으로 30m, 동쪽으로 60m, 남쪽으로 20m, 동쪽으로 100m, 북쪽으로 50m, 서쪽으로 160m 이동하면 

다시 출발점으로 되돌아가게 된다.

위 그림의 참외밭  면적은 6800m2이다. 

만약 1m2의 넓이에 자라는 참외의 개수가 7이라면, 이 밭에서 자라는 참외의 개수는 47600으로 계산된다.

1m2의 넓이에 자라는 참외의 개수와, 참외밭을 이루는 육각형의 임의의 한 꼭짓점에서 출발하여 

반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이가 순서대로 주어진다. 

이 참외밭에서 자라는 참외의 수를 구하는 프로그램을 작성하시오.

 

입력

 

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 

참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 

지나는 변의 방향과 길이 (1 이상 500 이하의 정수)가 둘째 줄부터 일곱 번째 줄까지 한 줄에 하나씩 순서대로 주어진다. 

변의 방향에서 동쪽은 1, 서쪽은 2, 남쪽은 3, 북쪽은 4로 나타낸다.

 

출력

 

첫째 줄에 입력으로 주어진 밭에서 자라는 참외의 수를 출력한다.

 

풀이

 

기하 단원 문제는 별 거 없어서 그냥 넘어가려고 했는데 재미있는 문제라서 가지고 왔다.

 

처음엔 무려 올림피아드 문제라길래 살짝 궁금했는데 그 정도로 어렵지는 않았음.

 

임의의 점에서 시작해 반시계 방향으로 육각형을 도는 패턴에서 넓이를 구하는 방법은 여러 가지가 있겠지만,

 

나는 아래와 같이 접근했다.

 

여섯 개의 변 중 짧은 4개의 변을 지나는 데에는 정해진 패턴이 있고, 이 정보를 적당히 더하고 곱해서

 

육각형의 넓이를 구하는 것이다.

 

이를 위해 이동 방향은 스트링 빌더를 이용해 받았고 길이는 리스트를 이용해 받았다.

 

이후 시작점이 임의라 위 패턴이 중간에 잘릴 수도 있기 때문에 두 바퀴를 돌린 후,

 

패턴의 시작 인덱스를 받아 계산을 완료했다.

package BackJoon;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Prob2477_2 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		StringBuilder dir = new StringBuilder();
		List<Integer> length = new ArrayList<>();

		int n = sc.nextInt();

		for (int i = 0; i < 6; i++) {

			dir.append(sc.next());
			length.add(sc.nextInt());
		}

		dir.append(dir);
		length.addAll(length);

		int idx = 0;

		if (dir.toString().contains("3131")) {
			idx = dir.indexOf("3131");
		} else if (dir.toString().contains("1414")) {
			idx = dir.indexOf("1414");
		} else if (dir.toString().contains("4242")) {
			idx = dir.indexOf("4242");
		} else if (dir.toString().contains("2323")) {
			idx = dir.indexOf("2323");
		}

		int area = (length.get(idx) + length.get(idx + 2))
			* (length.get(idx + 1) + length.get(idx + 3))
			- ((length.get(idx + 1)) * length.get(idx + 2));

		System.out.println(area * n);
	}
}

이렇게 별 건 없지만 잠시 생각할 거리가 있는 문제라 좋았다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함