코딩테스트/BOJ

[BOJ] 2477 참외밭 - JAVA

5월._. 2022. 2. 12.
728x90

1. 문제

https://www.acmicpc.net/problem/2477

 

2477번: 참외밭

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지

www.acmicpc.net

┓┏, ┗, ┛ 모양 육각형 밭의 넓이를 출력한다. 각 변의 길이는 시계 방향으로 변의 방향과 함께 주어진다.

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


2. 풀이

어떤 방향에서 시작하든지 두 번 등장하는 변이 밭에서 들어간 부분이다. ABAB 식으로 반복됐을 때, 들어간 부분의 넓이는 안쪽 B*A를 곱하면 구할 수 있다. 전체 밭의 넓이는 A와 B가 아닌 C, D를 곱하면 알 수 있다. 

  1. 먼저 앞선 두개를 prev1,2로 저장하고 인덱스를 2로 초기화한다. 
  2. 현재 인덱스 방향과 prev1이 같고 인덱스+1 방향과 prev2의 방향이 같아야 반복을 멈춘다. 이때, 이 나머지 값을 곱하면 전체 넓이를 구할 수 있기 때문에 X, Y에 저장한다. (지금 생각해보니 여기서 한 번에 X*Y 한 값을 저장해도 좋았겠다. 이게 더 가독성이 좋다고 위안해본다..ㅎㅎ)
  3. 안쪽 밭의 넓이는 prev2와 현재 인덱스에 있는 값을 곱하면 구할 수 있다.
  4. (전체 밭-안쪽 밭)*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

댓글