문제 해결/BaekJoon

[백준] [C++] 2309번 일곱 난쟁이

WSLim_97 2023. 1. 12. 19:50
반응형

https://www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

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

www.acmicpc.net


코드

#include <iostream>
using namespace std;

void Sort(int arr[], int count);
void DeleteValue(int arr[], int count, int sum);

const int COUNT = 9;

int main()
{
	int input, sum = 0;
	int arr[COUNT] = { };

	for (int i = 0; i < COUNT; i++)
	{
		cin >> input;
		arr[i] = input;
		sum += input;
	}

	DeleteValue(arr, COUNT, sum);
	Sort(arr, COUNT);

	for (int i = 0; i < COUNT; i++)
	{
		if (arr[i] == 0)
			continue;
		
		cout << arr[i] << endl;
	}

	return 0;
}

void Sort(int arr[], int count)
{
	for (int i = 0; i < count; i++)
	{
		int min = 101, minIndex = 0;
		for (int j = i + 1; j < count; j++)
		{
			if (min > arr[j])
			{
				min = arr[j];
				minIndex = j;
			}

			if (j == count - 1 && arr[i] > arr[minIndex])
			{
				int temp = arr[i];
				arr[i] = arr[minIndex];
				arr[minIndex] = temp;
			}
		}
	}
}

void DeleteValue(int arr[], int count, int sum)
{
	sum -= 100;
	for (int i = 0; i < count; i++)
	{
		for (int j = i + 1; j < count; j++)
		{
			if (arr[i] + arr[j] == sum)
			{
				arr[i] = 0;
				arr[j] = 0;
				return;
			}
		}
	}
}

풀이

9명의 난쟁이의 키가 주어졌을 때 진짜 난쟁이 7명을 찾아 오름차순으로 정렬해 출력하는 문제이다.

 

일곱 난쟁이의 키의 합은 100이다. 이 조건으로 진짜 난쟁이 7명을 찾는다.

 

먼저 모든 난쟁이의 키를 더한 뒤 100을 뺀다. 그리고 그 값에 해당하는 몸무게 조합을 찾는 DeleteValue 함수를 작성했다.

 

DeleteValue 함수는 가짜 난쟁이를 찾아 그 값을 0으로 바꾸었다.

 

Sort 함수를 사용해 오름차순으로 정렬한 뒤 0이 아닌 값을 모두 출력하고 종료하였다.

반응형