PS (C, C++)

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

최연재 2022. 8. 26. 04:22

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

 

2309번: 일곱 난쟁이

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

www.acmicpc.net

코드 (C)

#include <stdio.h>

void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int arr[9], sum = 0;
	for (int i = 0; i < 9; i++)
	{
		scanf("%d", &arr[i]);
		sum += arr[i];
	}
	
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8 - i; j++)
		{
			if (arr[j] > arr[j + 1]) swap(&arr[j], &arr[j + 1]);
		}
	}

	for (int i = 0; i < 8; i++)
	{
		for (int j = i + 1; j < 9; j++)
		{
			if ((sum - arr[i] - arr[j]) == 100)
			{
				for (int k = 0; k < 9; k++)
				{
					if (k == i || k == j) continue;
					printf("%d\n", arr[k]);
				}
				return 0;
			}
		}
	}

	return 0;
}

코드 (C++)

#include <iostream>
using namespace std;

void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int arr[9], sum = 0;
	for (int i = 0; i < 9; i++)
	{
		cin >> arr[i];
		sum += arr[i];
	}

	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8 - i; j++)
		{
			if (arr[j] > arr[j + 1]) swap(&arr[j], &arr[j + 1]);
		}
	}

	for (int i = 0; i < 8; i++)
	{
		for (int j = i + 1; j < 9; j++)
		{
			if ((sum - arr[i] - arr[j]) == 100)
			{
				for (int k = 0; k < 9; k++)
				{
					if (k == i || k == j) continue;
					cout << arr[k] << "\n";
				}
				return 0;
			}
		}
	}
	return 0;
}

코드설명

아홉 난쟁이들의 키를 입력받으며 더해나간다. 

 

버블정렬을 통해 오름차순으로 정렬한다. 

 

중첩반복문을 돌면서 모든 조합을 검사한다. 

이때 sum-arr[i]-arr[j] == 100 이라면 바로 i,j 인덱스를 제외한 모든 인덱스를 출력하고 프로그램을 종료한다. 

느낀 점

처음에는 어떻게 풀어야할지 감이 안 잡혔는데, 9명 중 7명을 고르는 것이 아니라 아닌 2명을 찾으면 된다는 것을 알고 바로 풀었다. 

'PS (C, C++)' 카테고리의 다른 글

[백준/C & C++] 11047 동전 0  (0) 2022.08.29
[백준/C & C++] 4948 베르트랑 공준  (0) 2022.08.29
[백준/C & C++] 1929 소수 구하기  (0) 2022.08.26
[백준/C & C++] 1978 소수 찾기  (0) 2022.08.26
[백준/C & C++] 1037 약수  (0) 2022.08.26