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! (피드백 감사합니다!)