Lewis's Tech Keep

[백준] 스티커 붙이기 본문

Java/알고리즘

[백준] 스티커 붙이기

Lewis Seo 2021. 3. 16. 15:03

참고 : www.acmicpc.net/problem/18808

 

 

 - 시뮬레이션 문제

 - 어려워서 풀이를 참고함.

 - 각 기능을 원하는 대로 구현하는 능력을 키워야 함.

 

더보기
import java.util.*;

public class Main {
    static int n, m, k;
    static int[][] paper = new int[12][12];
    static int r, c;
    static int[][] note = new int[42][42];

    private static void swapRC() {
        int t = r;
        r = c;
        c = t;
    }

    private static void rotate() {
        int[][] tmp = new int[12][12];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                tmp[i][j] = paper[i][j];
            }
        }

        for (int i = 0; i < c; i++) {
            for (int j = 0; j < r; j++) {
                paper[i][j] = tmp[r-1-j][i];
            }
        }

        swapRC();
    }

    private static boolean isPassable(int x, int y) {
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if(note[x+i][y+j] == 1 && paper[i][j] == 1) {
                    return false;
                }
            }
        }

        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if(paper[i][j] == 1) {
                    note[x+i][y+j] = 1;
                }
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        k = sc.nextInt();
        while(k-- > 0) {
            r = sc.nextInt();
            c = sc.nextInt();
            for (int i = 0; i < r; i++) {
                for (int j = 0; j < c; j++) {
                    paper[i][j] = sc.nextInt();
                }
            }

            for (int rot = 0; rot < 4; rot++) {
                boolean isPassable = false;
                for (int x = 0; x <= n-r; x++) {
                    if(isPassable) break;
                    for (int y = 0; y <= m-c; y++) {
                        if(isPassable(x,y)) {
                            isPassable = true;
                            break;
                        }
                    }
                }
                if(isPassable) break;
                rotate();
            }
        }
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if(note[i][j] > 0) cnt++;
            }
        }
        System.out.println(cnt);

    }
}

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

[백준] 2048 (easy)  (0) 2021.03.18
[백준] 2048(easy) - 실패  (0) 2021.03.16
[백준] 감시  (0) 2021.03.13
[백준] 동전2  (0) 2021.03.10
[백준] 파도반 수열  (0) 2021.03.10
Comments