PS/BaekJoon

[BaekJoon 2309번] 일곱 난쟁이(C++)

박땅콩 2022. 7. 7.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

[문제 풀이 사이트]

 

 

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

[문제 설명]

 

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.

아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.

아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

 

[입력]

 

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

 

[출력]

 

일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다.

 

[문제 풀이]

 

처음 풀이

 

: 9명 중 7명을 뽑는 모든 경우의 수에서 7명의 키를 합한 결과가 100일 때 출력하도록 코드를 구성

 

제출하고 다른 사람들의 풀이를 보는데 내 방법보다 더 쉬운 방법이 있어서 이해하고 해당 방법으로도 풀어보았다.

 

나중 풀이

 

  • 9명의 키를 입력 받고, 각 키의 합을 다 더해준다.
  • 입력 받은 키 값이 들어있는 배열을 오름차순 정렬한다.
  • 9명 중 2명을 뽑는다.
  • 각 키를 더한 변수에 뽑은 2명을 뺐을 때 100이 된 경우, 뽑은 2명을 제외하고 출력한다.

 

[최종 코드]

 

(처음 풀이)

#include <iostream>
#include <algorithm>
#include <vector>

int arr[9];
bool selected[9];
bool istrue = false;
std::vector<int> v;

void DFS(int idx, int cnt) {
    if (cnt == 7) { 
        int sum = 0;
        for (int i = 0; i < 9; ++i) {
            if (selected[i] == true) {
                sum += arr[i];
                v.push_back(arr[i]);
                if (sum == 100) {
                    istrue = true;
                }
            }
        }

        if (istrue) {
            for (int i = 0; i < v.size(); ++i) {
                std::cout << v[i] << '\n';
            }
        }
        else {
            v.clear();
        }
    }

    for (int i = idx; i < 9; ++i) {
        if (istrue) break;

        if (selected[i] == true) continue;
        selected[i] = true;

        DFS(idx, cnt + 1);
        selected[i] = false;
    }
}

int main(void) {
    std::ios::sync_with_stdio(false);
    for (int i = 0; i < 9; ++i) {
        int n;
        std::cin >> n;
        arr[i] = n;
    }
    std::sort(arr, arr + 9);

    DFS(0, 0);

    return 0;
}

 

(나중 풀이)

 

#include <bits/stdc++.h>
using namespace std;

int arr[9];

int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr); cout.tie(nullptr);
  int sum = 0;
  for(int i = 0; i < 9; i++) {
    cin >> arr[i]; // 입력(키)을 받고
    sum += arr[i]; // 입력(키)를 다 더해준다.
  }

  std::sort(arr, arr+9); // 오름 차순 정렬

    // 9명중 2명을 뽑는 for 문
  for(int i = 0; i < 8; ++i) {
    for(int j = i+1; j < 9; ++j) {
        if((sum -(arr[i] + arr[j])) == 100) { // 난쟁이 2명을 제외하고 합이 100이 될 때 -> 성공
            for(int k = 0; k < 9; ++k) {    
                if((k != i) && (k != j)) { // 난쟁이 2명을 제외한 7명 난쟁이만 포함할때 출력
                    cout << arr[k] << '\n';
                }
            }
            return 0;
        }
    }
  }

    return 0;
}
728x90

'PS > BaekJoon' 카테고리의 다른 글

[BaekJoon 1463번] 1로 만들기(C++)  (0) 2022.07.26
[BaekJoon 1850번] 최대공약수(C++)  (0) 2022.07.20
[BaekJoon 5397번] 키로거(C++)  (0) 2022.07.18
[BaekJoon 10845번] 큐(C++)  (0) 2022.07.14
[BaekJoon 10773번] 제로(C++)  (0) 2022.07.10

댓글