프로그래밍 공방

[백준] 19235번 : 모노미노도미노 본문

개발/문제해결

[백준] 19235번 : 모노미노도미노

hyosupsong 2021. 2. 21. 11:37

문제

www.acmicpc.net/problem/19235

 

19235번: 모노미노도미노

모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,

www.acmicpc.net

문제해결방법

이 문제는 몇 가지 함수를 만들고 사용해서 풀었다.

1. 보드에서 n번째 라인이 완성되었는지 체크하는 함수

2. 보드에서 n번째 라인을 지우는 함수

3. 보드의 n번째 열에 블록을 쌓는 함수

4. 보드에 있는 블록들 중 내려갈 수 있는 블록이 있으면 내리는 함수

5. 보드의 연한 칸에 블록이 있다면 몇 개의 라인에 있는지 알려주는 함수

또 Blue 보드 같은 경우에는 x, y를 바꿔서 똑같이 풀어주었다.

코드

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package blogQueue;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main19235_모노미노도미노 {
    
    public static int[][] blue = new int[6][4], green = new int[6][4];
 
    public static boolean check(int[][] map, int line) {
        for(int i=0; i<map[line].length; i++) {
            if(map[line][i]==0return false;
        }
        return true;
    }
    
    public static void removeLine(int[][] map, int line) {
        for(int i=0; i<map[line].length; i++) map[line][i] = 0;
    }
    
    public static void inputBlock(int[][] map, int col, int type) {
        int height = 0;
        if(type==1) {
            while(height<map.length && map[height][col]==0) height++;
            map[height-1][col] = 1;
        } else if(type==3) {
            while(height<map.length && map[height][col]==0) height++;
            map[height-1][col] = 1;
            map[height-2][col] = 1;
        } else {
            while(height<map.length && map[height][col]==0 && map[height][col+1]==0) height++;
            map[height-1][col] = 2;
            map[height-1][col+1= 2;
        }
    }
    
    public static void redraw(int[][] map) {
        for(int i=map.length-1; i>=0; i--) {
            for(int j=0; j<map[i].length; j++) {
                int height = i+1;
                if(map[i][j]==1) {
                    while(height<map.length && map[height][j]==0) height++;
                } else if(map[i][j]==2) {
                    while(height<map.length && map[height][j]==0 && map[height][j+1]==0) height++;
                    j++;
                    int temp = map[height-1][j-1]; 
                    map[height-1][j-1= map[i][j-1];
                    map[i][j-1= temp;
                }
                int temp = map[height-1][j]; 
                map[height-1][j] = map[i][j];
                map[i][j] = temp;
            }
        }
    }
 
    public static int countLine(int[][] map) {
        int c = 0;
        for(int i=0; i<2; i++) {
            for(int j=0; j<map[i].length; j++) {
                if(map[i][j]!=0) {
                    c++;
                    break;
                }
            }
        }
        return c;
    }
 
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int score = 0;
        int N = Integer.parseInt(br.readLine());
        for(int n=0; n<N; n++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int t = Integer.parseInt(st.nextToken());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            inputBlock(green, y, t);
            if(t==2) t=3;
            else if(t==3) t=2;
            inputBlock(blue, x, t);
            boolean flag = true;
            while(flag) {
                flag = false;
                for(int i=2; i<green.length; i++) {
                    if(check(green, i)) {
                        score++;
                        flag = true;
                        removeLine(green, i);
                    }
                }
                redraw(green);
            }
            int dl = countLine(green);
            for(int i=0; i<dl; i++) removeLine(green, green.length-1-i);
            redraw(green);
            
            flag = true;
            while(flag) {
                flag = false;
                for(int i=2; i<blue.length; i++) {
                    if(check(blue, i)) {
                        score++;
                        flag = true;
                        removeLine(blue, i);
                    }
                }
                redraw(blue);
            }
            dl = countLine(blue);
            for(int i=0; i<dl; i++) removeLine(blue, blue.length-1-i);
            redraw(blue);
        }
        int block = 0;
        for(int i=0; i<green.length; i++) {
            for(int j=0; j<green[i].length; j++) {
                if(green[i][j]!=0) block++;
                if(blue[i][j]!=0) block++;
            }
        }
        System.out.println(score);
        System.out.println(block);
        br.close();
    }
}
cs

코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.