[백준] 3040번 백설 공주와 일곱 난쟁이 - C++

potatoj11n·2024년 1월 20일

백준

목록 보기
7/36

🌱 문제 설명

3040번 백설 공주와 일곱 난쟁이

매일 매일 일곱 난쟁이는 광산으로 일을 하러 간다. 난쟁이가 일을 하는 동안 백설공주는 그들을 위해 저녁 식사를 준비한다. 백설공주는 의자 일곱개, 접시 일곱개, 나이프 일곱개를 준비한다.

어느 날 광산에서 아홉 난쟁이가 돌아왔다. (왜 그리고 어떻게 아홉 난쟁이가 돌아왔는지는 아무도 모른다) 아홉 난쟁이는 각각 자신이 백설공주의 일곱 난쟁이라고 우기고 있다.

백설공주는 이런 일이 생길 것을 대비해서, 난쟁이가 쓰고 다니는 모자에 100보다 작은 양의 정수를 적어 놓았다. 사실 백설 공주는 공주가 되기 전에 매우 유명한 수학자였다. 따라서, 일곱 난쟁이의 모자에 쓰여 있는 숫자의 합이 100이 되도록 적어 놓았다.

아홉 난쟁이의 모자에 쓰여 있는 수가 주어졌을 때, 일곱 난쟁이를 찾는 프로그램을 작성하시오. (아홉 개의 수 중 합이 100이 되는 일곱 개의 수를 찾으시오)


입력

총 아홉개 줄에 1보다 크거나 같고 99보다 작거나 같은 자연수가 주어진다. 모든 숫자는 서로 다르다. 또, 항상 답이 유일한 경우만 입력으로 주어진다.


출력

일곱 난쟁이가 쓴 모자에 쓰여 있는 수를 한 줄에 하나씩 출력한다.

풀이

#include <iostream>
using namespace std;
int main()
{   //배열 선언 및 입력
    int n[9], sum = 0;
    //입력
    for (int i = 0; i < 9; i++)
    {
        cin >> n[i];
        sum += n[i];
    }
//난쟁이 선택 조건
    int x, y, answer = 0;

    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
        {
//if문에서 i와 j가 같은 경우( 동일한 난쟁이를 선택한 경우)이거나 
//전체에서 두 난쟁이를 뺐을때 100이 아닌 경우는 계속 진행
            if (i == j || (sum - n[i] - n[j] != 100))
                continue;
            answer = 1;// 합이 100이 되는 난쟁이 조합을 찾으면 answer=1
            x = i;//x와 y에 해당 인덱스 저장(뺄 난쟁이들)
            y = j;
            break;
        }
        if (answer == 1) //조합을 찾으면 반복문 break
            break;
    }

    // 출력
    for (int i = 0; i < 9; i++)
    {
        if (i != x && i != y)//해당하지 않는 인덱스 출력
            cout << n[i] <<endl;
    }
    return 0;
}

❣️ 문제 요약:
아홉명의 난쟁이의 모자에 쓰인 숫자 9개 중 7개를 더했을때 숫자 100이 되는 숫자들이 출력되어야 한다.

🤔 생각해야할 점

  • 진짜 난쟁이들의 수 7개를 더하면 100이 된다.
  • 어느 난쟁이가 가짜인지 판별하려면 모두 더한 값에서 두 숫자를 뺐을때 100이 되면 두 숫자가 모자에 쓰인 난쟁이가 가짜인것을 알 수 있다.

아홉명의 난쟁이중 합이 100이 되는 난쟁이 7명을 찾는것보다 안되게 하는 난쟁이 2명을 찾는게 더 쉽다는 점을 이용해서 코드를 작성했다. 9개 짜리 배열을 만들어서 반복문으로 채워넣고 이중 반복문을 사용해서 조건문을 통해 두 난쟁이를 찾았다. 그 다음 다시 반복문을 통해 나머지 7 난쟁이의 인덱스를 조건문으로 출력했다.

0개의 댓글