백준 2563번 구현 문제를 Java로 풀어보았다.
결국 못 풀었다. 정답률이 꽤 높던데 화가 났다. 하지만 내가 멍청한 거니까 어쩔 수 없다. ㅎㅎ
애초에 겹치는 넓이를 따로 처리할 필요없이 해결하면 된다. 우리가 계산해야할 넓이만을 체크하면 되는 거다. 좌측 하단의 좌표가 입력값으로 주어진다. 그러면 정사각형의 변의 길이가 2
라고 하면, x~x+1 과 y~y+1만 점을 찍으며 지나가면 그 점의 개수가 곧 정사각형의 넓이가 되는 것이다.
이처럼 정사각형의 꼭짓점 하나를 입력 받을 때마다 그 정사각형이 커버하는 점의 위치를 찍으며 마지막에 모든 점의 개수를 세면 모든 정사각형이 커버하는 넓이를 계산할 수 있게 된다.
매번 점을 찍는데 만약 이미 점이 찍혀있다면 count해줘서 넓이값에 추가하면 된다.
이를 코드로 작성하면 다음과 같다.
int S = 0;
int n = Integer.parseInt(bfr.readLine());
for(int i=0; i<n; i++){
stk = new StringTokenizer(bfr.readLine());
int x = Integer.parseInt(stk.nextToken());
int y = Integer.parseInt(stk.nextToken());
for(int a=x; a<x+10; a++){
for(int b=y; b<y+10; b++){
if(map[a][b]==1) continue;
else map[a][b] = 1;
S++;
}
}
}
이 문제는 사실 내 힘으로 푼 문제가 아니니까 다음에 또 만나면 그땐 꼭 내 힘으로 조져야지.
아래는 다른 사람의 풀이를 참고해 작성한 제출한 코드다.
import java.util.*;
import java.io.*;
public class boj2563 {
public static void main(String args[]) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk;
int[][] map = new int[100][100];
int S = 0;
int n = Integer.parseInt(bfr.readLine());
for(int i=0; i<n; i++){
stk = new StringTokenizer(bfr.readLine());
int x = Integer.parseInt(stk.nextToken());
int y = Integer.parseInt(stk.nextToken());
for(int a=x; a<x+10; a++){
for(int b=y; b<y+10; b++){
if(map[a][b]==1) continue;
else map[a][b] = 1;
S++;
}
}
}
bfw.write(String.valueOf(S));
bfw.close();
}
}
의미는 없지만 맞은 코드라는 걸 알려주기 위해 첨부한다.