코딩 테스트
[백준] 2563번 색종이 - 실버5
한 면만 쓴 종이
2023. 1. 17. 14:13
🦴 정사각형 (색종이)
- 가로: 10, 세로: 10
🦴 색종이의 변과 도화지의 변이 평행하도록 붙임
🦴 색종이가 붙은 검은 영역의 넓이를 구하기
📌 입력
- 색종이의 수가 주어짐
- 한 줄에 하나씩 색종이를 붙인 위치가 주어짐
- 색종이를 붙인 위치는 두 개의 자연수로 주어짐
- 첫 번째 자연수: 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리
- 두 번째 자연수: 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리
- 색종이를 붙인 위치는 두 개의 자연수로 주어짐
- 색종이의 수: 100 이하
- 색종이가 도화지 밖으로 나가는 경우는 없음
📌 출력
- 첫째 줄에 색종이가 붙은 검은 영역의 넓이 출력
흠 ..
이걸 어떻게 풀지?
그리디?는 아닌거 같음
겹치는 부분 넓이를 구해야 하는뎅..
- 겹치는 부분이 있는 경우
- 가로: (왼쪽에서 더 가까운 색종이의 위치 + 10) - (왼쪽에서 더 먼 색종이의 위치)
- 세로: (아래쪽에서 더 가까운 색종이의 위치 + 10) - (아래쪽에서 더 먼 색종이의 위치)
- 구해서 전체에서 빼면 될 듯
- 아니 근데?! 만약에 겹치는 부분이 여러 군데이면 ... 어카지 ...
- 같은 방식으로 구하면 될 것 같은데... 흠..
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class B2563 { //2주차
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
List<Integer[]> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
String s = br.readLine();
String[] tmp = s.split(" ");
// String타입인 tmp를 Integer로 형변환
Integer[] len = Stream.of(tmp).mapToInt(Integer::parseInt).boxed().toArray(Integer[]::new);
list.add(len);
}
System.out.println(area(list));
}
static int area(List<Integer[]> list) {
int total = 100 * list.size();
for (Integer[] len : list) { //정사각형 수 만큼 반복
for (int i = 0; i < list.size(); i++) { //가로 길이
int recRow = len[0] + 10 - list.get(i)[0];
if (recRow >= 0 && recRow <= 10) {
// 세로 길이 구해서 양수면 전체 넓이에서 빼기
int recCol = 10 + list.get(i)[1] - len[1];
if (recRow == 10 && recCol == 10 || recRow == 0 && recCol == 0);
else if (recCol >= 0 && recCol <= 10) total -= recRow * recCol;
}
}
}
return total;
}
}
첫 시도.. 실패 ㅠ
오류 발견!
왜 이럴까 ..
if (recRow == 10 && recCol == 10 || recRow == 0 && recCol == 0);
아 이게 잘못된거군
무슨 멍청한 짓을 한거지? wow..
아 근데 저거 지우니까 이렇게 되네...
중복 제거를 위해서 Set이나 distinct같은걸 써봤는데, 배열을 담고있는 list라서 중복제거가 안된다..
그럼 for문 돌려서 중복을 제거해야겠다..
Boolean bool = true;
for (int i = 0; i < num; i++) {
String s = br.readLine();
String[] tmp = s.split(" ");
// String타입인 tmp를 Integer로 형변환
Integer[] len = Stream.of(tmp).mapToInt(Integer::parseInt).boxed().toArray(Integer[]::new);
for(Integer[] j : list) {
if (j[0].equals(len[0]) && j[1].equals(len[1])) {
bool = false;
break;
}
}
if (bool) list.add(len);
bool = true;
}
boolean 타입을 이용해서 중복을 없앴다.. 좀 너무 코드가 더러운거 같기도..
더 나은 방법이 있을텐데 ㅠ
근데 그래도 틀리네...
뭐가 잘못된거지?
난 이제 모르겠다ㅠ
검색할랭 ㅠㅠ
❤️ 완성본~
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class B2563 { //2주차
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[num][2];
for (int i = 0; i < num; i++) {
String s = br.readLine();
String[] tmp = s.split(" ");
// String타입인 tmp를 Integer로 형변환
arr[i][0] = Integer.parseInt(tmp[0]);
arr[i][1] = Integer.parseInt(tmp[1]);
}
System.out.println(area(arr));
}
static int area(int[][] rec) {
boolean[][] arr = new boolean[100][100];
int total = 0;
for(int[] tmp : rec) {
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 10; j++) {
if(!arr[tmp[0] + i][tmp[1] + j]) {
arr[tmp[0] + i][tmp[1] + j] = true;
total++;
}
}
}
}
return total;
}
}
그런데 3중 for문인게 좀 아쉽다..!