728x90
수학적?으로 접근해서 매우 복잡하게 해석했다..
좌표로 생각하면서 푸니까 서로 겹치는 부분을 찾기 위해 좌표가 주어지면 해당 좌표가 다른 좌표와 겹치는 지, 아닌지 검사하기 위해 조건문으로 다 걸러서 찾아냄
1차 시도
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long s = 0;
int n = Integer.parseInt(br.readLine());
int[][] lst = new int[n][2];
for(int i=0; i<n; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
lst[i][0] = Integer.parseInt(st.nextToken());
lst[i][1] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < n - 1; i++) {
for (int k = i; k < n; k++) {
//겹치는 부분 넓이 구하기
if (lst[i][0]-10 < lst[k][0] || lst[i][0]+10 > lst[k][0]){
if (lst[i][1]-10 < lst[k][1] || lst[i][1]+10 > lst[k][1]){
if (lst[k][0] < lst[i][0]){
if (lst[k][1] > lst[i][1]){
//1번영역
s += ((lst[k][0]+10) - (lst[i][0])) * (10-lst[k][1]);
}else if (lst[k][1] < lst[i][1]){
//2번 영역
s += ((lst[k][0]+10)-lst[i][0]) * ((lst[k][1]+10)-lst[i][1]);
}
} else if(lst[k][0] > lst[i][0]){
if(lst[k][1] < lst[i][1]){
//3번 영역
s += (lst[i][0]+10-lst[k][0]) * ((lst[k][1]+10)-lst[i][1]);
} else if(lst[k][1] > lst[i][1]) {
//4번 영역
s+= ((lst[i][0]+10) - lst[k][0]) * ((lst[i][1]+10)-lst[k][1]);
}
}
}
}
}
}
//전체 넓이 구하기
long totalS = 100 * n;
System.out.print(totalS-s);
br.close();
}
}
1 | 4 |
2 | 3 |
이렇게 나눠서 주어진 좌표를 lst에 넣고, 하나씩 검사하면서 서로 겹치는지 안 겹치는지 다 검사.. 근데 틀렸다고 나오네?
너무 복잡하게 생각한거 같아서 다른 사람 풀이를 참고해봤다.
2차 시도 (성공)
주어진 문제에
색종이가 100X100으로 정해져 있고, 주어진 색종이 모두 변의 길이가 10이라고 주어졌다.
[100][100]인 리스트를 생성해서 좌표가 주어지면 해당 좌표에서 색종이 넓이 만큼 리스트에 표시하면 되더라..
int[100][100]을 기본 도화지로 놓고, 좌표가 입력으로 주어지면 이중 for문으로 색종이 넓이만큼 1로 만들어주었음
마지막에 도화지에 1인 것의 개수만 세면 색종이의 넓이를 구할 수 있다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] data = new int[100][100];
for(int i=0; i<n; 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++){
data[j][k] = 1; //나중에 data에서 1의 개수 세면 전체 넓이 나옴.
}
}
}
//전체 넓이 구하기
long totalS = 0;
for(int[] n1:data) {
for(int n2:n1) {
if(n2==1){
totalS += 1;
}
}
}
System.out.print(totalS);
br.close();
}
}
너무 복잡하게 생각하지 말자..
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[구현] 2167 (0) | 2024.04.26 |
---|---|
[구현] 11866 요세푸스 문제 0 (0) | 2024.04.12 |
[구현] 4673 셀프 넘버 (1) | 2024.04.11 |
[파이썬] 10870 피보나치 수 5 (0) | 2024.04.10 |
14916 거스름돈 (0) | 2024.04.10 |