본문 바로가기

ALGORITHM

백준 2567 색종이-2 (Java)

1. 문제 링크

 

2567번: 색종이 - 2

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

입력받은 값 반복문을 통해 스카프가 존재하는 구역을 표시한다.

나는 세로와 가로를 따로 구했다.

반복문을 돌면서 스카프가 놓여있다면

가로에서 처음 놓였을 때 양쪽 세로를 미리 더했다.

위에는 스카프가 있는데 밑에는 스카프가 없다면 가로를 1만큼 더한다. 

가로에서 처음 놓인게 아닐 때, 밑이 없으면 밑을 1만큼 추가한다.

 

이렇게 스카프 밑면의 값을 다 구한 다음에 *2하면 가로 값도 전부 구한 것이다.

세로 + 가로 * 2를 하면 전체 둘레가 나온다.

 

다른 친구들은 사방탐색을 해서 주위 값들이 있으면 +해서 결과를 빨리 냈더라.

하지만 저 풀이를 굳이굳이 고집하다 한참 걸린..

 

4. 코드

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

public class Main {
	static int N, sum, se,ga;
	static boolean[][] map;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		map = new boolean[101][100];
		N = Integer.parseInt(br.readLine());
		String[] split = new String[2];
		int x, y;
		for(int i=0;i<N;i++) {
			split = br.readLine().split(" ");
			x = Integer.parseInt(split[0]);
			y = Integer.parseInt(split[1]);
			for(int j=0;j<10;j++) {
				for(int k=0;k<10;k++) {
					map[x+j][y+k] = true;
				}
			}
		} 
		
		sum=0;
		boolean now = false;
		se = 0;
		ga = 0;
		for(int i=0;i<100;i++) {
			for(int j=0;j<100;j++) {
				if(map[i][j]) { //스카프 놓인 쪽
					if(!now) { //가로에서 처음 놓인 부분
						now = true;
						se+=2; //세로 한번에 양 옆 다 하게
						if(map[i-1][j]&&!map[i+1][j] ) { //위에는 있었는데 밑이 더 없으면
							ga++; //밑 추가
						}
					}
					else { //앞이 체크된 부분
						if(!map[i+1][j]) { //밑이 더 없으면
							ga++; //밑 추가
						}
					}
				}
				else{ //스카프가 없으면
					now = false;
				}
			}
		}
		System.out.println(se+ga*2);
		
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 1920 수 찾기 (Java)  (0) 2023.03.29
백준 1759 암호 만들기 (Java)  (0) 2023.03.28
백준 27160 할리갈리 (Java)  (0) 2023.03.26
백준 1717 집합의 표현 (Java)  (0) 2023.03.25
백준 2805 나무 자르기 (Java)  (0) 2023.03.24