-

기타 :: 백준 :: 여러 직사각형의 전체 면적 구하기 :: 2672 본문

알고리즘/기타

기타 :: 백준 :: 여러 직사각형의 전체 면적 구하기 :: 2672

lingi04 2016. 12. 21. 20:18

여러 직사각형의 전체 면적 구하기

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




문제를 푸는것도 어렵지만 자릿수 맞춰 출력하는 것도 조금 까다로운 것 같다..

1
2
3
4
5
6
        long ans = (long)(chk(x, y)*100);
        if(ans%100 == 0){
            System.out.println(ans/100);
        }else{
            System.out.printf("%.2f", ((double)ans)/100);
        }
cs

요렇게 했을 때 백준 사이트의 테스트케이스와 codeup에서는 맞았지만 채점 결과 틀렸다고 나왔다.


1
2
3
4
5
6
        double ans = (chk(x, y));
        if((long)ans == ans){
            System.out.println((long)ans);
        }else{
            System.out.printf("%.2f", (ans));
        }
cs

해결책을 찾다가 요렇게 바꿨을 때 맞았습니다!!가 떴다.

뭐가 다른지 모르겠다. 공부를 더 하면 알 수 있으려나..


[문제 풀이]

이 문제를 처음 접했을 때 가장 먼저 떠오르는 방법은 모든 사각형의 넓이를 모두 구한 후 겹치는 영역을 빼는 방법  이지 않을까 싶다.

나 또한 이 생각을 처음 했었다. 하지만 사각형이 겹쳤는지, 몇번 겹쳤는지를 모두 체크해줘야 하고, 그 외에도 여러 가지 어려움이 있을 것 같아 다른 방법을 생각해봤다.


1. 예제로 나와있는 그림에서 각 사각형의 세로선과 가로선을 연장시킨다.

2. 그러면 크기는 일정하지 않지만 바둑판과 같은 격자무늬가 생긴다.

3. 격자무늬에 해당하는 조그만한 사각형들이 입력받은 큰 사각형에 포함되는지 여부를 체크한다.

4. 큰 사각형에 포함된다면 해당 영역의 넓이를 답에 더해준다.

5. 모든 연산을 끝낸 후 구한 값을 출력해주면 끝!


나는 입력받은 좌표들을 ArrayList에 집어넣고, 입력이 끝난 후 정렬시켜 사용했다.


여기서 주의할 점은, 출력조건이다. 

소숫점 이하가 0이면 정수영역만,

0이 아니라면 소숫점 2자리 까지 출력해줘야 함!!



Comments