https://www.acmicpc.net/problem/2563
이 문제의 키포인트는 겹치는 부분을 제외하는 것!
각 색종이의 면적에서 겹치는 부분을 빼려고 삽질을 하다가... 생각해보니 색종이 2개만 겹칠 수 있는 게 아니라, 전부 겹칠 수도 있고, 각 색종이 면적이 1*1도아니고 10*10이라 너무 복잡했다.
도저히 안 풀려서 결국 검색... 😢
최대한 코드는 안 보고 힌트만 얻기 위해, 참고 블로그글의 키워드만 슈루룩 봤더니 boolean 값
을 사용했다는 것이 눈에 띄었다.
왜 이 생각을 못 했을까^^ 겹치는 부분을 손쉽게 처리할 수 있는 방법임을 깨닫고 다시 풀이를 작성해보았다.
도화지가 100*100 크기이므로 [101][101] 크기의 boolean 배열
을 만들고,
각 색종이는 10*10 크기이므로 입력받은 위치 +10까지를 true
가 되게 했다.
이후 true인 부분만 count해주면 면적 계산이 손쉽게 끝난다. 하하...
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
boolean Area[][] = new boolean [101][101]; // 도화지 (기본 false)
int N = Integer.parseInt(br.readLine()); // 색종이의 수
int x, y; // 색종이의 위치
int area = 0; // 색종이가 있는 면적
String input;
for(int i=0; i<N; i++) {
// 색종이의 위치 입력받기
input = br.readLine();
x = Integer.parseInt(input.split(" ")[0]);
y = Integer.parseInt(input.split(" ")[1]);
// 해당 위치+10까지 true로 변경
for(int j = x; j < x+10; j++) {
for(int k= y; k < y+10; k++) {
Area[j][k] = true;
}
}
}
// true인 점 카운트
for(int i=0; i <= 100; i++){
for(int j=0; j <= 100; j++){
if(Area[i][j] == true)
area++;
}
}
// 출력
System.out.println(area);
}
}
두 반복문을 합쳐서 처리할 수 있었다.
원래는 중첩된 반복문을 2번 사용했다.
1번 반복문에서 이미 true인 경우를 처리하지 않아서 해당 반복문에서 area를 +1하면 겹치는 부분에서 중복 카운트되기 때문이었다.
for(int i=0; i<N; i++) {
// 색종이의 위치 입력받기
(생략)
// 해당 위치+10까지 true로 변경
for(int j = x; j < x+10; j++) {
for(int k= y; k < y+10; k++) {
Area[j][k] = true;
}
}
}
// true인 점 카운트
for(int i=0; i <= 100; i++){
for(int j=0; j <= 100; j++){
if(Area[i][j] == true)
area++;
}
}
하지만 true인 경우를 제외하는 if문을 추가하면, 바로 area를 +1 해줄 수 있었다!
조금 더 깔끔해졌다~
for(int i=0; i<N; i++) {
// 색종이의 위치 입력받기
(생략)
// 해당 위치+10까지 true로 변경
for(int j = x; j < x+10; j++) {
for(int k= y; k < y+10; k++) {
if(Area[j][k] == false){
Area[j][k] = true;
area ++;
}
}
}
}