티스토리 뷰

출저 : https://www.acmicpc.net/problem/3019


"아구가 맞니?"



해당 문제를 처음에는 모든 조각의 상대 위치를 3?4? 차원 배열로 만들어서 모든 경우에 수에 따라 검색하려고 했다. 하지만 조각의 위치를 정의하는데 너무 복잡하고 더러워서 다른 방법을 찾아봄...

아구가 맞는지를 탐색하는 방법이다.  아래와 같이 돌출된 부분에 값을 준다. 전체 높이가 같은지 확인한다.
아래 왼쪽 그림의 경우 높이는 2,1 이고 ㅓ 의 경우 돌출된 칸이 1칸 이므로 0,1 이렇게 한 후 높이와 이 값을 더한다.

왼쪽) 2 + 0 = 1+ 1
오른쪽 ) 2+ 0 = 1 + 1 = 2 + 0 


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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
class Main {
 
    static int c,p;
    static int[] heights;
    
    public static void main (String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        c = Integer.parseInt(st.nextToken());
        p = Integer.parseInt(st.nextToken());
        
        heights = new int[c];
        
        st = new StringTokenizer(br.readLine());
        
        for (int i = 0; i < c; i++) {
            heights[i] = Integer.parseInt(st.nextToken());
        }
        
        int res = 0;
        
        switch(p) {
        case 1:
            res = c + solve(new int[]{0,0,0,0});
            break;
        case 2:
            res = solve(new int[]{0,0});
            break;
        case 3:
            res = solve(new int[]{1,1,0})
                + solve(new int[]{0,1});
            break;
        case 4:
            res = solve(new int[]{0,1,1}) 
                + solve(new int[]{1,0});
            break;
        case 5:
            res = solve(new int[]{0,0,0}) 
                + solve(new int[]{1,0}) 
                + solve(new int[]{0,1,0}) 
                + solve(new int[]{0,1});
            break;
        case 6:
            res = solve(new int[]{0,0,0}) 
                + solve(new int[]{0,0}) 
                + solve(new int[]{1,0,0}) 
                + solve(new int[]{0,2});
            break;
        case 7:
            res = solve(new int[]{0,0,0}) 
                + solve(new int[]{2,0}) 
                + solve(new int[]{0,0,1}) 
                + solve(new int[]{0,0});
            break;
        }
        System.out.println(res);
    }
    
    static int solve(int[] h) {
        int res = 0;
        int size = h.length;
        
        for (int i = 0; i <= c-size; i++) {
            int gap = h[0+ heights[i];
            boolean ok = true;
            for (int j = 0; j < size; j++) {
                if(h[j] + heights[i+j] != gap) {
                    ok = false;
                    break;
                }
            }
            if(ok) res++;
        }
        return res;
    }
}
 
cs






댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday