-
[백준] 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문인게 좀 아쉽다..!
'코딩 테스트' 카테고리의 다른 글
[백준] 1929번 소수 구하기 (0) 2023.01.19 [백준] 2675번 문자열 반복 - 브론즈 2 (0) 2023.01.17 배열 형변환 (Stream) (0) 2023.01.17 [백준] 20115번 에너지 드링크(그리디) - 실버3 (0) 2023.01.15 [백준] 1978번 소수 찾기 - 실버 5 (0) 2023.01.14