Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 2567] 색종이 - 2 (Java) 본문

Problem Solving

[BOJ 2567] 색종이 - 2 (Java)

흑개 2022. 2. 10. 23:00

https://www.acmicpc.net/problem/2567

 

2567번: 색종이 - 2

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class P2567 {
	static int[][] map=new int[100][100];
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		int N=Integer.parseInt(br.readLine());
		int x, y;
		int answer=0;
		for (int i=0; i<N; i++) {
			StringTokenizer st=new StringTokenizer(br.readLine(), " ");
			x=Integer.parseInt(st.nextToken());
			y=Integer.parseInt(st.nextToken());
			for (int j=y; j<y+10; j++) {
				for (int k=x; k<x+10; k++) {
					map[j][k]=1;
				}
			}
		}
		for (int i=0; i<100; i++) {
			for (int j=0; j<100; j++) {
				if (map[i][j]==1) {
					if (isContour(i,j-1,i,j+1)) {
						answer++;
					}
					if (isContour(i-1, j, i+1, j)) {
						answer++;
					}
				}
			}
		}
		System.out.println(answer);
	}
	
	public static boolean isContour(int left_y, int left_x, int right_y, int right_x) {
		if (left_y<0 || left_x<0 || right_y>=100 || right_x>=100) return true;
		return (map[left_y][left_x]==0 && map[right_y][right_x]==1) || (map[left_y][left_x]==1 && map[right_y][right_x]==0);
	}

}

 

괜히 어렵게 푼..듯..

 

가로, 세로로 검사해서 주변에 1 1 0, 0 1 1 이런 형태이면 둘레를 +1 하도록 해줬다.

근데 사실 이럴 필요가 없는게, 1로 표시된 애들 중에서 4방향을 검사해서 인접 4방향 중 0인 애들을 만나면 ++1 해서 아주 간단하게 풀 수 있다.

 

1로 표시된 애들 중에, 주변 4방을 검사해서 0인 애들이 있으면 그만큼 둘레라는 것을 캐치하는게 중요했다.