코딩 테스트

[백준] 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문인게 좀 아쉽다..!