728x90
1. 문제
https://www.acmicpc.net/problem/2477
┓┏, ┗, ┛ 모양 육각형 밭의 넓이를 출력한다. 각 변의 길이는 시계 방향으로 변의 방향과 함께 주어진다.
변의 방향에서 동쪽은 1, 서쪽은 2, 남쪽은 3, 북쪽은 4로 나타낸다.
2. 풀이
어떤 방향에서 시작하든지 두 번 등장하는 변이 밭에서 들어간 부분이다. ABAB 식으로 반복됐을 때, 들어간 부분의 넓이는 안쪽 B*A를 곱하면 구할 수 있다. 전체 밭의 넓이는 A와 B가 아닌 C, D를 곱하면 알 수 있다.
- 먼저 앞선 두개를 prev1,2로 저장하고 인덱스를 2로 초기화한다.
- 현재 인덱스 방향과 prev1이 같고 인덱스+1 방향과 prev2의 방향이 같아야 반복을 멈춘다. 이때, 이 나머지 값을 곱하면 전체 넓이를 구할 수 있기 때문에 X, Y에 저장한다. (지금 생각해보니 여기서 한 번에 X*Y 한 값을 저장해도 좋았겠다. 이게 더 가독성이 좋다고 위안해본다..ㅎㅎ)
- 안쪽 밭의 넓이는 prev2와 현재 인덱스에 있는 값을 곱하면 구할 수 있다.
- (전체 밭-안쪽 밭)*1m^2당 당근 개수를 출력한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_2477_참외밭 {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int[][] points = new int[6][2];
int carrot = Integer.parseInt(in.readLine());
StringTokenizer st;
for (int i = 0; i < 6; i++) {
st = new StringTokenizer(in.readLine());
points[i] = new int[]{Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())};
}
int X, Y;
int[] prev1 = points[0];
int[] prev2 = points[1];
int idx = 2;
while (true) {
int nidx = (idx + 1) % 6;
if (points[idx][0] == prev1[0] && points[nidx][0] == prev2[0]) {
X = points[(nidx+1)%6][1];
Y = points[(nidx+2)%6][1];
break;
}
prev1 = prev2;
prev2 = points[idx];
idx = nidx;
}
int innerX = points[idx][1];
int innerY = prev2[1];
int result = (X*Y - innerX * innerY) * carrot;
System.out.println(result);
}
}
3. 결과
처음에 덱으로 풀었다가 반복을 잘못설정했는지 틀렸길래 직관적인 배열로 변경했다.
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 2635 수 이어가기 - JAVA (0) | 2022.02.12 |
---|---|
[BOJ] 10157 자리배정 - JAVA (0) | 2022.02.12 |
[BOJ] 2491 수열 - JAVA (0) | 2022.02.12 |
[BOJ] 17406 배열돌리기 4 - JAVA (0) | 2022.02.12 |
[BOJ] 16935 배열돌리기 3 - JAVA (0) | 2022.02.12 |
댓글