본문 바로가기
알고리즘/백준

2563번 문제 : 색종이

by son_i 2023. 5. 5.
728x90

2563번: 색종이 (acmicpc.net)

 

2563번: 색종이

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

www.acmicpc.net

자바

색종이가 붙은 부분의 넓이를 구하는 문제

색종이의 수 num만큼 result 에 10*10*num을 하고

좌표가 들어오면 x좌표 +10. y좌표 +10 만큼의 배열에 수를 더해준다.

 

for문으로 배열을 돌면서 값이 2이상인 애들을 result에서 빼준다.

근데 처음에 틀렸다고 떠서 생각해보니까 두 장이 겹칠 수도 있고 그 이상이 겹칠 수도 있어서 뺴주는 값을 겹친 수만큼 곱해줘야한다. 

 

다른 더 좋은 코드가 있을지 봤는데 arr배열을 애초에 boolean형으로 선언하여서 false였다면 (자리를 차지하고 있지 않았다면) 그 칸을 true로 바꾸고 cnt를 1증가 시켜주는 것 ! 그렇게 하면 true인 칸(이미 넓이를 차지한 칸)에 있어서는 cnt값이 증가하지 않을 것이고 결국 마지막에 cnt를 출력하면 딱 한 번 방문한 칸의 넓이만 셀 것이니까 코드가 간결해질 수 있다.

 

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

class Main{
	public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	int num = Integer.parseInt(br.readLine());
    	int arr[][] = new int[100][100];
    	int result = num*10*10;
    	for(int i=0;i<num;i++) {
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		int x = Integer.parseInt(st.nextToken());
    		int y = Integer.parseInt(st.nextToken());
    		
    		for(int j=x;j<x+10;j++) {
    			for(int k=y;k<y+10;k++) {
    				arr[j][k] ++;
    			}
    		}
    	}
    	for(int m=0;m<100;m++) {
    		for(int n=0;n<100;n++) {
    			if(arr[m][n] >=2)
    				result -= 1*(arr[m][n]-1);
    		}
    	}
    	System.out.println(result);
 	}
}

'알고리즘 > 백준' 카테고리의 다른 글

11005번 문제 : 진법변환2  (0) 2023.05.05
2745번 문제 : 진법변환  (0) 2023.05.05
10798번 문제 : 세로읽기  (2) 2023.05.02
2566번 문제 : 최댓값  (0) 2023.05.02
2738번 문제 : 행렬 덧셈  (0) 2023.05.02