티스토리 뷰
문제
시골에 있는 태양이의 삼촌 댁에는 커다란 참외밭이 있다.
문득 태양이는 이 밭에서 자라는 참외가 도대체 몇 개나 되는지 궁금해졌다.
어떻게 알아낼 수 있는지 골똘히 생각하다가 드디어 좋은 아이디어가 떠올랐다.
유레카! 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);
}
}
이렇게 별 건 없지만 잠시 생각할 거리가 있는 문제라 좋았다.
'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글
[Python]2562번, 리스트, 특정 값의 인덱스 구하기 (0) | 2023.02.04 |
---|---|
[Python]10818번, 리스트에서 최대, 최소값 구하기 (0) | 2023.02.04 |
[Python]10871번, 리스트, 괄호 없이 출력, 반복문, 조건문, 비교연산자 (0) | 2023.02.03 |
[BackJoon]11478번 (0) | 2023.01.31 |
[Python]10807번, 리스트, 반복문, 조건문, 비교연산자 (0) | 2023.01.30 |
[Python]1110번, 더하기 사이클, 증감 연산자 (2) | 2023.01.29 |
- Total
- Today
- Yesterday
- java
- 유럽여행
- 유럽
- 파이썬
- 면접 준비
- 동적계획법
- 맛집
- 중남미
- 지지
- 스프링
- 칼이사
- 여행
- 백준
- 야경
- BOJ
- 남미
- Algorithm
- 기술면접
- 리스트
- 세모
- 세계일주
- 알고리즘
- 자바
- Python
- 세계여행
- 스트림
- RX100M5
- a6000
- Backjoon
- spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |