티스토리 뷰

728x90
반응형

문제

 

 

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 

이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 

색종이의 변과 도화지의 변이 평행하도록 붙인다. 

이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

 

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

 

입력

 

첫째 줄에 색종이의 수가 주어진다. 

이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 

색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고,

 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 

색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다.

 

출력

 

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

 

풀이

 

굳이 말하자면 나는 배열이라는 자료형이 싫다.

 

정확하게는 싫다기 보단 자유도가 지나치게 낮아 사용하기 불편해 피하는 편이라는 표현이 정확하다.

 

기본으로 제공되는 참조형 데이터타입인 주제에 형변환이나 박싱을 하려면

 

for문이나 스트림을 돌며 한 땀 한 땀 해주어야 하는 데다,

 

contains(), indexOf(), max(), sort()와 같은 기본적인 기능도 없기 때문이다.

 

특히 이차원 배열은 언뜻 보기엔 가독성도 좋아 보이고 코드도 짧아 보이지만 가지고 뭘 하려면 여간 귀찮은 일이 아니다.

 

해서 나는 이번에도 억지로 리스트를 이용해 풀어보았다.

 

접근 방식은 이렇다.

 

먼저 주어진 이차원 공간을 가로로 잘라 이어붙여 일차원 리스트를 생성한다. 당연히 상호 간엔 간단한 매핑 공식이 존재한다.

 

사각형이 주어지면 매핑 공식을 이용해 일차원 리스트를 칠한다(값을 1로 변경한다).

 

사각형이 겹치면? 상관 없다. 한 번 1로 변경된 값을 또다시 1로 변경할 뿐이다.

 

이런 식으로 N번 반복 후 색칠이 완료되면 일차원 리스트에서 1의 개수를 센다.

 

위 예제는 단순화 시키기 위해 25조각으로 나누었지만, 주어진 문제는 100 X 100 = 10,000개로 나누어야 한다.

 

그림까지 그리며 뭔가 있어 보이지만 코드로 보면 별 거 없다.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Prob2563 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        List<Integer> areaList = new ArrayList<>();

        for (int i = 0; i < 10000; i++) {
            areaList.add(0);
        }

        for (int i = 0; i < n; i++) {

            int x = sc.nextInt();
            int y = sc.nextInt();
            int z = y * 100 + x; // 시작점

            for (int j = z; j < z + 1000; j = j + 100) {
                for (int k = 0; k < 10; k++) {
                    areaList.set(j + k, 1);
                }
            }
        }

        long area = areaList.stream()
                .filter(a -> a == 1)
                .count();

        System.out.println(area);
    }
}
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함