참외밭
문제
시골에 있는 태양이의 삼촌 댁에는 커다란 참외밭이 있다. 문득 태양이는 이 밭에서 자라는 참외가 도대체 몇 개나 되는지 궁금해졌다. 어떻게 알아낼 수 있는지 골똘히 생각하다가 드디어 좋은 아이디어가 떠올랐다. 유레카! 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로 나타낸다.
출력
첫째 줄에 입력으로 주어진 밭에서 자라는 참외의 수를 출력한다.
예제 입력 1
7
4 50
2 160
3 30
1 60
3 20
1 100
예제 출력 1
47600
내가 푼 풀이.
ㄱ, ┏, ┗, ┛ 이렇게 4 가지 모양이 있다. 여기서 반시계 방향으로 값을 입력받는다는 조건이 있었다.
여기서 ㄱ, ┗ 모양이면 max세로길이 다음에 max가로길이가 오고, ┏, ┛모양이면 max가로길이 다음에 max세로길이가 온다는 점을 이용했다.
그리고 전체 사각형의 너비, 즉 가로 max * 세로 max 값에 작은 사각형의 너비값을 빼서 넓이를 구했다.
- 우선 가로, 세로 길이를 담을 arrayList인 width와 height를 생성했다.
- 반복문을 통해 방향과 값을 입력받아, 0 2 4번째 입력은 width에, 1 3 5번째 입력은 height에 넣었다. 방향은 신경쓰지 않고, 처음 입력받는 값을 가로 값이라고 가정했다!
- 가로 세로에서 각각 max인 값과, 해당 값의 index를 찾았다.
- 입력받을 때 가로값, 세로값, 가로값, .. 이런 식으로 입력받았다. 그래서 전체 입력받은 6개 값에서 -> 가로 세로에서 각각 max인 값의 index를 계산했다. 가로값을 먼저 입력받았으니 idxAW(전체 값에서 max 가로값의 인덱스)는 width 리스트에서 max값*2, idxAH는 height 리스트에서 max값 *2+1이 된다.
- 그리고 작은 사각형의 가로와 세로, calcW, calcH 값을 계산했다. ㄱ, ┗ 모양이면 if문에서 idxAW - idxAH == 1 || idxAW - idxAH == -5 조건을 만족할 것이고, ┏, ┛모양이면 else문의 코드가 실행될 것이다.
ㄱ,ㄴ 모양이면 calcW는 max값 다음에 있는 값이고, calcH는 max값 이전에 있는 값이다. ┏, ┛모양이면 그 반대이다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int cnt = Integer.parseInt(br.readLine());
// 1.
ArrayList<Integer> width = new ArrayList<>();
ArrayList<Integer> height = new ArrayList<>();
// 2.
StringTokenizer st;
int num;
for (int i = 0; i < 6; i++) {
st = new StringTokenizer(br.readLine());
st.nextToken();
num = Integer.parseInt(st.nextToken());
if (i % 2 == 0) {
width.add(num);
} else {
height.add(num);
}
}
// 3.
int maxW = Collections.max(width);
int maxH = Collections.max(height);
int idxW = width.indexOf(maxW);
int idxH = height.indexOf(maxH);
// 4.
int idxAW = idxW * 2;
int idxAH = idxH * 2 + 1;
// 5.
int calcW = 0, calcH = 0;
if (idxAW - idxAH == 1 || idxAW - idxAH == -5) {
calcW = idxW == 2 ? 0 : idxW + 1;
calcH = idxH == 0 ? 2 : idxH - 1;
} else {
calcW = idxW == 0 ? 2 : idxW - 1;
calcH = idxH == 2 ? 0 : idxH + 1;
}
calcW = width.get(calcW);
calcH = height.get(calcH);
bw.write((maxW * maxH - calcW * calcH) * cnt + "");
bw.flush();
bw.close();
br.close();
}
}
참조한 다른 분 풀이.
https://kau-algorithm.tistory.com/11
간단한 규칙이 있었다. 가로 값 max, 세로 값 max 다다음에 입력받은 가로 세로값이 전체 사각형에서 빼야하는 작은 사각형의 가로 세로값이 된다!!
'6. 자료구조 & 알고리즘 > 6-2. 백준' 카테고리의 다른 글
백준 - [ 1003번: 피보나치 함수 ] (0) | 2023.07.15 |
---|---|
백준 - [ 11051번: 이항 계수2 ] (0) | 2022.08.16 |
백준 - [1181번: 단어 정렬 ] (0) | 2022.07.30 |
백준 - [1436번: 영화감독 숌] (0) | 2022.07.29 |
2751번: 수 정렬하기 2 (0) | 2022.07.01 |