ALGORITHM
백준 2567 색종이-2 (Java)
공부하는_다온
2023. 3. 27. 21:53
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);
}
}