백준 2567번: 색종이 - 2

최창효·2022년 2월 13일
0
post-thumbnail


문제 설명

  • 도형의 둘레를 구하는 문제입니다.

접근법

  • 다른 색종이들과 마찬가지로 색종이가 존재하는 곳을 1로, 그렇지 않은 곳을 0으로 표현합니다.
  • 둘레를 1이 접하고 있는 0의 개수라고 생각할 수 있습니다. 하지만 이 로직은 도화지의 끝면에 붙여진 상황을 고려하지 못합니다.(0이 없기 때문에)
    • 이를 고려하는 방법은 두 가지가 있습니다.
      • 도화지 끝면에 달라붙은 경우를 if문으로 처리해 준다.
      • 도화지 밖을 0으로 채운다.
    • 저는 첫번째 경우로 문제를 풀었습니다.

정답

package simple_test;
import java.util.*;
public class testtt {
	static int[][] board = new int[100][100];
	static final int[] dx = {1,0,-1,0};
	static final int[] dy = {0,1,0,-1};
	static int answer;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = Integer.parseInt(sc.nextLine());
		for (int i = 0; i < N; i++) {
			StringTokenizer st= new StringTokenizer(sc.nextLine()," ");
			int r = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
            //색종이가 붙여진 곳은 1로 채우기
			for (int j = r; j < r+10; j++) {
				for (int j2 = c; j2 < c+10; j2++) {
					board[j][j2] = 1;
				}
			}
		}
		
        //둘레 검사
		for (int i = 0; i < 100; i++) {
			for (int j = 0; j < 100; j++) {
				round_check(i,j);
			}
		}
		System.out.println(answer);

	}
	
	
	
	public static void round_check(int x, int y) {
    	//해당 칸이 0인 경우는 필요 없습니다.
		if(board[x][y] == 0)return;

		for (int i = 0; i < 4; i++) {
        	//해당 칸이 1이고, 자기 옆이 0이라면 둘레에 포함됩니다.
			if(0<=x+dx[i] && x+dx[i]<100 && 0<=y+dy[i] && y+dy[i]<100 && board[x+dx[i]][y+dy[i]] == 0) {
				answer++;
			}
            //왼쪽면에 밀착한 경우
			if(0>x+dx[i]) {
				answer++;
			}
            //아래에 밀착한 경우
			if(0>y+dy[i]) {
				answer++;
			}
            //오른쪽에 밀착한 경우
			if(100<=x+dx[i]) {
				answer++;
			}
            //왼쪽에 밀착한 경우
			if(100<=y+dy[i]) {
				answer++;
			}
		}
		
	}
	

	
}

기타

  • 1에서 인접한 0을 조사하는 방법이 꺾이는 부분까지도 직관적으로 잘 설명하기 때문에 가장 정석적인 방법인 것 같습니다.
profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글