728x90
🔗 문제 링크
https://www.acmicpc.net/problem/2669
📌 문제 개요
4개의 직사각형이 주어졌을 때,
이들이 차지하는 **전체 면적(합집합)**을 구하는 문제이다.
단, 겹치는 영역은 중복해서 계산하지 않는다.
📌 접근 방법
이 문제는 좌표 계산으로 풀 수도 있지만,
가장 직관적인 방법은 다음과 같다.
2차원 배열에 직접 칠하기
- 100x100 크기의 배열 생성
- 직사각형 영역을 true로 채움
- 마지막에 true 개수 세기
📌 핵심 아이디어
겹침 처리
map[x][y] = true;
- 이미 true여도 그대로 유지
- 즉, 겹쳐도 자동 처리됨
좌표 범위
for(int x = x1; x < x2; x++)
for(int y = y1; y < y2; y++)
- (x2, y2)는 포함 ❌
- 문제에서 면적 기준이라 중요 포인트
📌 전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
boolean[][] map = new boolean[101][101];
for (int i = 0; i < 4; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
for(int x = x1; x < x2; x++){
for(int y = y1; y < y2; y++){
map[x][y] = true;
}
}
}
int count = 0;
for(int i = 0; i <= 100; i++){
for(int j = 0; j <= 100; j++){
if(map[i][j]) count++;
}
}
System.out.println(count);
}
}
📌 정리
- 좌표 문제는 직접 채우기 방식이 가장 안정적
- 겹침 처리 고민 필요 없음
- 구현 난이도는 낮지만, 범위 조건이 핵심
728x90
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 백준 5635 생일 JAVA 풀이 (정렬, 시간복잡도) (0) | 2026.03.27 |
|---|---|
| 백준 9656 돌 게임 2 JAVA 풀이 (게임이론, 시간복잡도) (0) | 2026.03.26 |
| 백준 13909 창문 닫기 JAVA 풀이 (수학, O(1)) (0) | 2026.03.24 |
| 백준 8979 올림픽 JAVA 풀이 (정렬, 구현, 시간복잡도) (0) | 2026.03.23 |
| 백준 9093 단어 뒤집기 JAVA 풀이 (문자열, 구현, 시간복잡도) (0) | 2026.03.22 |