더 많이 실패하기

공부 106일차: 백준 2563번 색종이 자바 java 본문

알고리즘/백준

공부 106일차: 백준 2563번 색종이 자바 java

김발자~ 2022. 11. 13. 21:04
반응형

2563 색종이

https://www.acmicpc.net/problem/2563

 

2563번: 색종이

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변

www.acmicpc.net

 

 

 


백준 단계별로 풀어보기 9단계 2차원 배열 (3) 2563번 문제 색종이


문제


 

 

 

 


오답 &과정 생각해보기


 

오답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        // 색종이의 수
        int n = Integer.parseInt(br.readLine());
        int[][] arr = new int[n][2];
        
        for(int i = 0; i < n; i++) {
            //StringTokenizer는 한 줄씩 인식
            st = new StringTokenizer(br.readLine());    
            arr[i][0= Integer.parseInt(st.nextToken());
            arr[i][1= Integer.parseInt(st.nextToken());
        }
        
        // 디버깅
        System.out.println(Arrays.deepToString(arr));
        
        int sum = n*100;
        for(int i = 0; i < n; i++) {
            for(int j = 1; j < n; j++) {
                if( (arr[j][0< arr[i][0]+10 && arr[i][0]+10 < arr[j][0]+10&& (arr[j][1< arr[i][1&& arr[i][1< arr[j][1]+10)) {
                    
                    sum -= Math.abs(arr[i][0]+10-arr[j][0]) * Math.abs(arr[j][1]+10-arr[i][1]);
                }
            }
                
        }
        
        System.out.println(sum);
    }
 
}
cs

예제를 보고 이런 식으로 생각해서 짜던 코드였는데,

이러면 겹치는 경우를 모두 if문 조건에 넣어야 한다는 것을 깨닫고.. 예제의 경우에 해당하는 조건만 넣어봤다가 바로 방법을 바꿨다

(혹시 몰라서 제출하긴 했다 ㅎ)

 

 

그래서 생각, 검색해보다가 찾은 결론은 각 좌표의 넓이를 1로 보고 하나하나 살펴보면서 더하는 것

 

즉,

1. x~x+10, y~y+10 반복문을 돌리면서 해당 좌표가 이미 칠해졌는지 아닌지(0인지 아닌지) 확인

2. 만약 전에 칠해지지 않았다면 1*1 정사각형의 넓이값인 1을 주고, 넓이에 더한다

 

 

 


정답 인정 코드


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        // 색종이의 수
        int n = Integer.parseInt(br.readLine());
        int[][] paper = new int[100][100];
        
        int area = 0;    //넓이 변수
        for(int i = 0; i < n; 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++) {    //x좌표 한줄당
                for(int k = y; k < y + 10; k++) {    //y좌표 모두 확인
                    if(paper[j][k] == 0) {    //아직 해당 좌표가 칠해지지 않았다면
                        paper[j][k] = 1;    //칠하고
                        area++;    //넓이에 더하기
                    } 
                }
            }
            
        }
        
        System.out.println(area);
        
    }
 
}
cs

 

과정 설명이 이해가 가지 않을까 싶어 주석에 설명을 많이 넣어봤다

처음 생각해본 방법이 너무 바보 같아서 혼자 헛웃음.. 브론즈 1 문제인데 엄청 돌아가서 생각한 것 같다

 

 

 


 

반응형
Comments