본문 바로가기

Notice
Recent Posts
Recent Comments
«   2024/11   »
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
Tags
더보기
Archives
관리 메뉴

16987. 계란으로 계란치기 본문

알고리즘 문제풀기/백준(Acmicpc)

16987. 계란으로 계란치기

알광(Algwang) 2019. 3. 2. 18:19

문제링크 : https://www.acmicpc.net/problem/16987


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
import java.util.Scanner;
 
// 16986 인싸들의 가위바위보 문제와 마찬가지로 dfs를 통한 완전탐색으로 해결했다.
// 처음 문제를 접했을 때 이걸 어떻게 해결하지 했다가 N이 최대 8이라는 것을 보고 바로 접근!
 
public class Main {
    static int N;
    static int eggCount=0;
    static class Egg{
        int weight;
        int dur;
        Egg(){
            weight=0;
            dur=0;
        }
        Egg(int d, int w){
            dur=d;
            weight=w;
        }
    }
    static void dfs(int turn, boolean[] isOk, int c, Egg[] eggs) {
    // 주의할 점은 계란을 들었다면 깨지지 않은 계란이 존재하는 한
    // 아무것도 치지 않고 다시 내려놓을 수 없다는 것이다.
    // 그래서 tempFlag를 통해 더이상 칠 계란이 없다면 바로 종료조건을 넣어주는 방법을 사용했다.
        if (turn == N) {
            eggCount = Math.max(c, eggCount);
            return;
        }    
        if (isOk[turn]) {
            dfs(turn + 1, isOk, c, eggs); // 계란이 이미 깨져있다면 다음으로 넘어감
        }
        else {
            boolean tempFlag = true;
            for (int i = 0; i < N; i++) {
                if (!isOk[i]) tempFlag = false// 칠 수 있는 계란이 있다면 false
                if (!isOk[i]&&i!=turn) { // 계란이 깨져있지 않고 같은 계란이 아니라면
                    eggs[i].dur -= eggs[turn].weight;
                    eggs[turn].dur -= eggs[i].weight;
                    int tempCount = 0;
                    if (eggs[turn].dur <= 0) {
                        isOk[turn] = true;
                        tempCount++;
                    }
                    if (eggs[i].dur <= 0) {
                        isOk[i] = true;
                        tempCount++;
                    }
                    dfs(turn + 1, isOk, c+tempCount, eggs); // 쳐보고 넘긴 다음 원래대로 돌린다.
                    if (eggs[turn].dur <= 0) {
                        isOk[turn] = false;
                    }
                    if (eggs[i].dur <= 0) {
                        isOk[i] = false;
                    }
                    eggs[turn].dur += eggs[i].weight;
                    eggs[i].dur += eggs[turn].weight;
                }
            }
            if(!tempFlag) dfs(N, isOk, c, eggs); // 칠 수 있는 계란이 없다는 뜻이므로 바로 종료시킵니다.
        }
    }
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        N=scan.nextInt();
        Egg eggs[]=new Egg[10];
        for(int i=0;i<N;i++) {
            int d=scan.nextInt();
            int w=scan.nextInt();
            eggs[i]=new Egg(d,w);
        }
        boolean isOk[]=new boolean[10];
        dfs(0, isOk, 0, eggs);
        System.out.println(eggCount);
    }
}
cs


'알고리즘 문제풀기 > 백준(Acmicpc)' 카테고리의 다른 글

17071. 숨바꼭질 5  (4) 2019.03.26
7569. 토마토  (0) 2019.03.06
16986. 인싸들의 가위바위보  (0) 2019.03.02
1322. X와 K  (0) 2019.01.31
15711. 환상의 짝꿍  (2) 2019.01.30
Comments