https://www.acmicpc.net/problem/2563
2563번: 색종이
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변
www.acmicpc.net
문제
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.
입력
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다
출력
첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.
핵심
1. scanner를 통해 색종이의 개수를 정한다.
2. 도화지의 가로 세로 크기에 맞춰 2차원 배열 paper를 생성한다.
3. 반복문을 통해 색종이의 x좌표와 y좌표를 입력받고, 색종이의 크기만큼 해당좌표에 1을 대입한다.
4. 모든 색종이의 넓이를 담을 int형 변수 area를 선언 및 초기화해주고, paper배열의 원소가 1이면 넓이에 더해준다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] paper = new int[100][100];
for (int i = 0; i < n; i++) {
int x = scanner.nextInt();
int y = scanner.nextInt();
for (int j = x; j < x+10; j++) {
for (int k = y; k < y + 10; k++) {
paper[j][k] = 1;
}
}
}
int area = 0;
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
if(paper[i][j]==1){
area += paper[i][j];
}
}
}
System.out.println(area);
}
}
처음 문제에 접근할 때에는 색종이의 총 넓이(100 * n)에서 겹치는 부분을 빼려고 시도했었다.
그러려면 색종이가 겹치는 경우에 대한 규칙을 찾았어야 했고, 겹치는 부분의 가로,세로 길이를 10에서 뺀다음 서로 곱해줘야 하는 작업이었는데, 나에겐 로직이 매우 복잡하다고 느껴졌다..
그래서 다른 풀이를 참고하니,도화지(2차원 배열)에서 색종이가 차지하는 부분에 대해서만 1이라는 값을 넣었고,2차원 배열 내에 원소의 값이 1이면 그 값을 다 더해주기만 하면 로직은 간단해지는 것을 참고하여 코드를 짜보았다.
'Algorithm' 카테고리의 다른 글
| [백준 알고리즘 JAVA] 2903번 중앙 이동 알고리즘 (0) | 2024.04.11 |
|---|---|
| [백준 알고리즘 JAVA] 2720번 세탁소 사장 동혁 (0) | 2024.04.11 |
| [백준 알고리즘 JAVA] 10798번 세로읽기 (1) | 2024.04.11 |
| [백준 알고리즘 JAVA] 14215번 세 막대 (0) | 2024.04.10 |
| [백준 알고리즘 JAVA] 5073번 삼각형과 세 변 (2) | 2024.04.10 |