mondegreen

(BJ_2567) 색종이2 본문

알고리즘 풀이 및 리뷰/백준

(BJ_2567) 색종이2

앙갱 2023. 2. 28. 00:46
반응형

0. 문제

1. 내 코드

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int cpNum = Integer.parseInt(br.readLine());
		int[][] wP = new int[102][102];

		for (int cP = 0; cP < cpNum; cP++) {
			String cpIdx = br.readLine();
			StringTokenizer st = new StringTokenizer(cpIdx);
			int r = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());

			for (int l = r + 1; l < r + 11; l++) {
				for (int m = c + 1; m < c + 11; m++) {
					wP[l][m] = 1;
				}
			}
		}

		int around = 0;
		for (int i = 0; i < wP.length; i++) {
			for (int j = 0; j < wP[i].length; j++) {
				if (wP[i][j] == 1) {
					if (wP[i - 1][j] == 0)
						around++;
					if (wP[i + 1][j] == 0)
						around++;
					if (wP[i][j - 1] == 0)
						around++;
					if (wP[i][j + 1] == 0)
						around++;
				}
			}
		}
		System.out.println(around);
	}
}

먼저 주어진 흰 바탕의 크기보다 크게 배열을 선언해 경계를 벗어나는 경우에도 오류가 나지 않도록 처리했고 색종이의 왼쪽하단 꼭지점의 좌표를 기준으로 10만큼의 거리에 모두 1을 넣어주었다. 

 

처음의 시도는 색종이의 경계선에만 1의 값을 넣고 겹치는 부분은 삭제하는 방향을 생각했으나, 두 개의 색종이가 맞닿아 있는 경우 둘레가 아님에도 불구하고 세어지는 한계가 발생했다. 

 

고민하다가 색종이 면적은 모두 1로 입력하고 1이 입력된 위치를 기준으로 4방 탐색 후 0이 발견되면 1씩 증가해서 세는 방식으로 구현했다. 구현 자체는 어렵지 않았지만 둘레를 구하는 방식을 생각해내는 것이 관건인 문제였다.

반응형