문제
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다.
이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다.
이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.
입력
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다.
색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고,
두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다.
색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다.
출력
첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.
| 예제입력 | 예제출력 |
| 3 3 7 15 7 5 2 |
260 |
⭕ 풀이
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int tc = Integer.parseInt(br.readLine());
boolean[][] board = new boolean[100][100];
int cnt = 0;
while(tc-->0){
StringTokenizer st = new StringTokenizer(br.readLine());
int row = Integer.parseInt(st.nextToken());
int col = Integer.parseInt(st.nextToken());
for(int i=row;i<row+10;i++){
for(int j=col;j<col+10;j++){
if(!board[i][j]) {
board[i][j] = true;
cnt++;
}
}
}
}
br.close();
System.out.print(cnt);
}
}
✅ 풀이 흐름
1. 이번문제 역시 마찬가지로 고정크기이기때문에 100*100 크기의 2차원 배열을 선언한다
1-1. ❗) Boolean과 boolean의 차이는 기본형타입와, 참조형타입이라는 점인데
Boolean은 null을 가질수있고 boolean은 null이 없이 false,true 두개의 값만 가질 수 있다.
2. 2차원배열을 시작하며 색종이의 시작점으로부터 +10칸까지의 정사각형크기에 해당하는 인덱스위치를 true로 바꾼다.
3. 주어진 색종이의 갯수만큼 반복하는데 이미 true로 칠해진 자리는 다시 반복할필요가 없으므로 if(!board[i][j]) 의 조건을 넣는다
3-1. 이렇게 if문을 추가해 진행하면 true로 칠하는 과정과 cnt++ 를 하는 과정을 따로 나눌필요가없다.
+) 처음에 true로 칠하고 그다음에 다시 반복문을 열어 cnt갯수를 세도록 작성했다가 수정했다.
4. 이렇게 모든 색종이의 갯수만큼 반복이 끝났으면 지금까지 센 cnt를 출력한다.
-출처
'Algorithm > Baekjoon(Java)' 카테고리의 다른 글
| [백준/JAVA] 2566 : 최댓값 (2차원 배열) (1) | 2022.12.06 |
|---|---|
| [백준/JAVA] 2738 : 행렬 덧셈 (2차원 배열) (0) | 2022.12.05 |
| [백준/JAVA] 5597 : 과제 안 내신 분..? (0) | 2022.12.05 |
| [백준/JAVA] 10807 : 개수 세기 (0) | 2022.12.05 |
| [백준/JAVA] 1436 : 영화감독 숌 ( 브루트포스 (전체탐색) ) (0) | 2022.08.24 |