※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)
[실버4] 2567. 색종이 - 2 (Java)
J 크
2023. 8. 24. 18:22
728x90
반응형
https://www.acmicpc.net/problem/2567
2567번: 색종이 - 2
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록
www.acmicpc.net
드디어 예비군 끝,,,
※ 문제를 요약하면 아래와 같습니다.
▶ 100 x 100 사이즈의 도화지 위에 가로, 세로 크기가 각각 10인 정사각형 모양의 검은색 색종이를 부착
▶ 위와 같이 색종이를 붙인 후, 색종이가 붙은 영역의 둘레 계산
▶ Input : 첫줄에 색종이의 갯수, 두번째 줄 이후엔 각 색종이의 가장 왼쪽 아래 좌표를 순서대로 col, row의 좌표값 입력
▶ Output : 색종이가 붙은 영역의 둘레 출력
◈ Input
4
3 7
5 2
15 7
13 14
◈ Output
96
◎ 코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.
▶ 색종이가 붙은 좌표값들을 boolean 배열로 받아서 true로 표시
▶ 가장 낮은 row 부터 가장 높은 row까지, 가장 낮은 col에서 가장 높은 col까지 탐색
▶ 상하좌우 방향 중 색종이가 붙지 않은 영역 존재 시 1씩 카운트
▶ 카운트 총 갯수 == 둘레의 길이
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
int nPapers = Integer.parseInt(bReader.readLine());
boolean[][] barrPapers = new boolean[101][101];
int nMaxRow = 0;
int nMinRow = 101;
int nMaxCol = 0;
int nMinCol = 101;
for(int k = 0; k < nPapers; k++) {
StringTokenizer st = new StringTokenizer(bReader.readLine());
int nCol = Integer.parseInt(st.nextToken());
int nRow = Integer.parseInt(st.nextToken());
if(nMaxRow < nRow) nMaxRow = nRow;
if(nMinRow > nRow) nMinRow = nRow;
if(nMaxCol < nCol) nMaxCol = nCol;
if(nMinCol > nCol) nMinCol = nCol;
for(int i = nRow; i < nRow + 10; i++) {
for(int j = nCol; j < nCol + 10; j++) {
if(!barrPapers[i][j])
barrPapers[i][j] = true;
}
}
}
int nEdgeCount = 0;
for(int i = nMinRow; i <= nMaxRow+10; i++) {
for(int j = nMinCol; j <= nMaxCol+10; j++) {
if(barrPapers[i][j]) {
if (!barrPapers[i][j - 1]) nEdgeCount++;
if (!barrPapers[i][j + 1]) nEdgeCount++;
if (!barrPapers[i + 1][j]) nEdgeCount++;
if (!barrPapers[i - 1][j]) nEdgeCount++;
}
}
}
bWriter.write(String.valueOf(nEdgeCount));
bWriter.flush();
bWriter.close();
}
}
읽어주셔서 감사합니다!
Good Luck! (피드백 감사합니다!)