[URL]
https://www.acmicpc.net/problem/2309
2309번: 일곱 난쟁이
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
www.acmicpc.net
[풀이 과정]
1. 난쟁이 9개 오름차순 정렬
2. 9개 중 2개 선택 (재귀 활용 완전 탐색)
3. 9개의 합에서 2개의 합을 빼서 100이면 정답
4. 7개 난쟁이 정답 오름차순으로 출력
[소스 코드]
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 | #include <stdio.h> #include <algorithm> using namespace std; int arr[9]; // 난쟁이 9명 bool check[9] = { 0, }; // 9명 중 2명 체크 int cand[2]; // 제외 시킬 2명 index 저장 int sum9 = 0; // 9명의 합 int dap[2]; void go(int cnt) { if (cnt == 2) { if (sum9 - (arr[cand[0]] + arr[cand[1]]) == 100) { // (전체 9명 합 - 제외 시킬 2개 합) == 100 이면 당첨 dap[0] = cand[0]; dap[1] = cand[1]; } return; } for (int i = cand[cnt - 1]; i < 9; i++) { if (check[i] == false) { check[i] = true; cand[cnt] = i; cnt++; go(cnt); cnt--; check[i] = false; } } } int main() { for (int i = 0; i < 9; i++) { scanf("%d", &arr[i]); sum9 += arr[i]; } sort(arr, arr + 9); //오름차순 정렬, 출력을 위해서~ go(0); for (int i = 0; i < 9; i++) { if (i == dap[0] || i == dap[1]) { continue; } printf("%d\n", arr[i]); } return 0; } | cs |
'Algorithm > 백준' 카테고리의 다른 글
[BOJ] - 17144. 미세먼지 안녕! (0) | 2019.06.25 |
---|---|
[BOJ] - 2178. 미로 탐색 (0) | 2019.06.20 |
[BOJ] - 14503. 로봇 청소기 (0) | 2019.04.13 |
[BOJ] - 16234. 인구 이동 (0) | 2019.04.12 |
[BOJ] - 14499. 주사위 굴리기 (0) | 2019.04.11 |