728x90
1. 문제
https://www.acmicpc.net/problem/2567
색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 둘레의 길이를 구하는 프로그램을 작성하시오.
2. 풀이
- 가장자리를 굳이 따로 계산해주고 싶지 않아서 도화지의 크기를 넉넉하게 했다.
- 색종이를 입력받을 때마다 색종이가 도화지를 차지하는 만큼 1로 변경했다.
- 문제 입력조건이 x는 왼쪽에서부터 멀어진 만큼, y는 아래에서부터 멀어진 만큼이라 y를 계산할 때 100에서 입력받은 값을 뺐다. 그리고 종이를 1로 채워나갈 때 -1씩 해가며 체크했다. (굳이 이렇게 안해도 됐을 것 같다. 어차피 둘레는 똑같은데..)
- 한 칸 한 칸 비교해가며 1일 때는 주변에 0이 있는지 확인하고, 0일 때는 주변에 1이 있는지 확인했다. 이 때, 위에서부터 아래로, 왼쪽에서 오른쪽 방향으로 체크하기 때문에 4방향 전부 체크하지 않고 오른쪽과 아래방향만 체크했다.
- 다음 ni와 nj가 범위 안에 있고 그 값이 현재의 paper[i][j]와 다르다면 둘레를 1 추가한다.
import java.io.*;
import java.util.*;
public class BOJ_2567_색종이2 {
public static int[][] paper = new int[101][101];
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(in.readLine());
for(int n=0;n<N;n++){
StringTokenizer st = new StringTokenizer(in.readLine());
int x = Integer.parseInt(st.nextToken());
int y = 100-Integer.parseInt(st.nextToken());
for(int i=0;i<10;i++) {
for(int j=0;j<10;j++){
paper[y-i][x+j] = 1;
}
}
}
int cnt = 0;
int[][] deltas = {{0,1},{1,0}};//오른쪽, 아래
for(int i=0;i<=100;i++){
for(int j=0;j<=100;j++){
for(int d=0;d<2;d++){
int ni = i+deltas[d][0];
int nj = j+deltas[d][1];
if(ni>=0 && ni<=100 && nj>=0 && nj<=100 && paper[i][j] != paper[ni][nj]) cnt++;
}
}
}
System.out.println(cnt);
}
}
3. 결과
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 2580 스도쿠 - JAVA (0) | 2022.02.23 |
---|---|
[BOJ] 2178 미로탐색 - JAVA (0) | 2022.02.23 |
[BOJ] 1012 유기농 배추 - JAVA (0) | 2022.02.23 |
[BOJ] 2667 단지번호 붙이기 - JAVA (0) | 2022.02.23 |
[BOJ] 2108 통계학 - JAVA (0) | 2022.02.23 |
댓글