Problem/Brute force
[C/C++] BOJ 3/2 코딩테스트 대비 모의고사 A번 - 계란으로 계란치기
지무룩
2019. 3. 2. 17:28
BOJ 3/2 코딩테스트 대비 모의고사 A번 - 계란으로 계란치기
문제 링크 : https://www.acmicpc.net/contest/problem/396/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 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 | // BOJ 3/2 코딩테스트 대비 모의고사 A번 - 계란으로 계란치기 #include<iostream> using namespace std; int N, S, W, ans; bool flag; struct e { int broken; int durability; int weight; }typedef EGG; int arr[9]; EGG egg[9]; // 깨진 계란 복구하기 void crushback(int e1, int e2) { egg[e1].durability += egg[e2].weight; egg[e2].durability += egg[e1].weight; if (egg[e1].durability > 0) egg[e1].broken = 0; if (egg[e2].durability > 0) egg[e2].broken = 0; return; } // 계란 깨뜨리기 void crush(int e1, int e2) { egg[e1].durability -= egg[e2].weight; egg[e2].durability -= egg[e1].weight; if (egg[e1].durability <= 0) egg[e1].broken = 1; if (egg[e2].durability <= 0) egg[e2].broken = 1; return; } // 깨진 계란의 개수를 세는 함수 int findnumbroken() { int v = 0; for (int i = 0; i < N; i++) { if (egg[i].broken == 1) v++; } return v; } void simulate(int idx) { flag = false; // 갱신 if (idx >= N) { int val = findnumbroken(); if (ans < val) ans = val; return; } // 깨지지 않은 계란 하나 골라 깨뜨리기 for (int i = 0; i < N; i++) { // 깨뜨리기 if (i != idx && egg[i].broken == 0) { crush(idx, i); int k = idx + 1; while (egg[k].broken == 1) k++; simulate(k); crushback(idx, i); flag = true; } } // 더 이상 깨뜨릴 수 있는 계란이 없을 때, 값 갱신 if (!flag) { int k = idx + 1; while (egg[k].broken == 1) k++; simulate(k); } return; } int main() { cin >> N; for (int i = 0; i <= N; i++) { egg[i].broken = 0; egg[i].durability = 0; egg[i].weight = 0; } for (int i = 0; i < N; i++) cin >> egg[i].durability >> egg[i].weight; simulate(0); cout << ans; } | cs |