본문 바로가기

TEAM STUDY/알고리즘 코딩 테스트 스터디

4회차 - 알고리즘 기록 : 색종이

728x90
반응형

📌색종이

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

이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다.

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

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

<도화지 위에 놓인 세 색종이>

 

입력 형식

첫 줄에는 테스트케이스의 수 T가 주어진다.

각 테스트케이스의 첫 줄에는 색종이의 수 N이 1이상 100이하의 자연수로 공백없이 주어진다.

이후 N줄에 걸쳐서 각 색종이의 정보가 공백으로 구분된 90보다 작거나 같은 두 자연수로 주어진다.

  • 첫 번째 숫자는 색종이의 왼쪽 변과 도화지의 왼쪽 벽 사이의 거리이다
  • 두 번째 숫자는 색종이의 아랫쪽 변과 도화지의 아랫쪽 변 사이의 거리이다.
  • 모든 색종이는 도화지의 영역을 벗어나지 않는다.

 

출력 형식

각 테스트케이스에 대하여 색종이가 차지하는 넓이를 한 줄에 공백없는 정수로 출력한다. 

 

예시

- 입력

2
3
37
157
52
4
37
52
157
1314

 

- 출력

260
336

 

코드 풀이

/**
 * 색종이들이 덮고 있는 영역의 총 넓이를 계산하는 함수
 *
 * @param papers
 * @param n
 * @return
 */
public static int getCoveredArea(Paper[] papers, int n)
{
    int answer = 0; //색종이들이 덮은 영역의 총 넓이

    int [][] border = new int[101][101];

    for( Paper p : papers ){
        for( int row = p.bottomRow; row <= p.topRow; row ++){
            for( int col = p.leftColumn; col <= p.rightColumn; col ++){
                border[row][col] += 1;
            }
        }
    }

    for( int row = 0; row <= 100; row ++){
        for( int col = 0; col <= 100; col ++){
            if(border[row][col] >= 1){
                answer++;
            }
        }
    }

    return answer;
}
728x90
반응형