728x90
자바
색종이가 붙은 부분의 넓이를 구하는 문제
색종이의 수 num만큼 result 에 10*10*num을 하고
좌표가 들어오면 x좌표 +10. y좌표 +10 만큼의 배열에 수를 더해준다.
for문으로 배열을 돌면서 값이 2이상인 애들을 result에서 빼준다.
근데 처음에 틀렸다고 떠서 생각해보니까 두 장이 겹칠 수도 있고 그 이상이 겹칠 수도 있어서 뺴주는 값을 겹친 수만큼 곱해줘야한다.
다른 더 좋은 코드가 있을지 봤는데 arr배열을 애초에 boolean형으로 선언하여서 false였다면 (자리를 차지하고 있지 않았다면) 그 칸을 true로 바꾸고 cnt를 1증가 시켜주는 것 ! 그렇게 하면 true인 칸(이미 넓이를 차지한 칸)에 있어서는 cnt값이 증가하지 않을 것이고 결국 마지막에 cnt를 출력하면 딱 한 번 방문한 칸의 넓이만 셀 것이니까 코드가 간결해질 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
int arr[][] = new int[100][100];
int result = num*10*10;
for(int i=0;i<num;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
for(int j=x;j<x+10;j++) {
for(int k=y;k<y+10;k++) {
arr[j][k] ++;
}
}
}
for(int m=0;m<100;m++) {
for(int n=0;n<100;n++) {
if(arr[m][n] >=2)
result -= 1*(arr[m][n]-1);
}
}
System.out.println(result);
}
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
11005번 문제 : 진법변환2 (0) | 2023.05.05 |
---|---|
2745번 문제 : 진법변환 (0) | 2023.05.05 |
10798번 문제 : 세로읽기 (2) | 2023.05.02 |
2566번 문제 : 최댓값 (0) | 2023.05.02 |
2738번 문제 : 행렬 덧셈 (0) | 2023.05.02 |