ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 2563번 색종이 - 실버5
    코딩 테스트 2023. 1. 17. 14:13

     

    🦴 정사각형 (색종이)

    • 가로: 10, 세로: 10

    🦴 색종이의 변과 도화지의 변이 평행하도록 붙임

    🦴 색종이가 붙은 검은 영역의 넓이를 구하기

     

     

    📌 입력

    1. 색종이의 수가 주어짐
    2. 한 줄에 하나씩 색종이를 붙인 위치가 주어짐
      • 색종이를 붙인 위치는 두 개의 자연수로 주어짐
        • 첫 번째 자연수: 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리
        • 두 번째 자연수: 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리
    3. 색종이의 수: 100 이하
    4. 색종이가 도화지 밖으로 나가는 경우는 없음

    📌 출력

    • 첫째 줄에 색종이가 붙은 검은 영역의 넓이 출력

     

    흠 ..

    이걸 어떻게 풀지?

    그리디?는 아닌거 같음

     

    겹치는 부분 넓이를 구해야 하는뎅..

     

    • 겹치는 부분이 있는 경우
      • 가로: (왼쪽에서 더 가까운 색종이의 위치 + 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문인게 좀 아쉽다..!

     

Designed by Tistory.