백준 2309 일곱 난쟁이

apircity·2022년 5월 15일
0

boj

목록 보기
8/24
post-thumbnail

boj 2309 일곱 난쟁이

📋 how to solve

크게 두가지의 방법으로 풀 수 있다

  • 진짜 난쟁이들의 합이 100인 것을 활용하여 더하여 100인 조합을 찾은 후 이를 출력
  • 가짜 난쟁이들의 합은 전체-100인 것을 활용하여 가짜 난쟁이를 거르고 진짜 난쟁이를 출력
    ->1번째는 9개 중에서 진짜인 7명을 찾아야 되지만 2번째는 가짜인 2명만 찾아내면 되기 때문에 이를 구하는 것이 더 빠르고 효율적일 것 같아 필자는 2번째 방법으로 문제를 풀었다

🔔 런타임 에러(out of bounds)

#include<stdio.h>
int main()
{
	int nan[9] = { 0 };
	int tn[7] = { 0 }; //진짜 난쟁이들의 키
	int sum = 0; //아홉 난쟁이의 키의 합
	int over = 0; //sum-100 (넘친 키)
	int x = 0, y = 0; //가짜 난쟁이가 배열의 몇번째에 있는 지
	for (int i = 0; i < 9; i++)
	{
		scanf("%d", &nan[i]);
		sum += nan[i];
	}
	over = sum - 100;
	for (int i = 0; i < 9; i++)
	{
		for (int j = i + 1; i < 9; j++)
		{
			if ((nan[i] + nan[j]) == over)
			{
				x = i;
				y = j;
				break;
			}
		}
	}
	for (int i = 0; i < 9; i++) //진짜 난쟁이들의 키 배열
	{
		if (i == x && i == y)
			continue;
		else
		{
			for (int j = 0; j < 7; j++)
			{
				tn[j] = nan[i];
			}
		}
	}
	for (int i = 0; i < 7; i++)
	{
		for (int j = i + 1; j < 7; j++)
		{
			if (tn[i] > tn[j])
			{
				int tmp = tn[i];
				tn[i] = tn[j];
				tn[j] = tmp;
			}
		}
	}
	for (int i = 0; i < 7; i++)
	{
		printf("%d\n", tn[i]);
	}
	return 0;
}

지금까지 런타임에러는 많이 봤지만 out of bounds는 처음 봐서 당황했다
찾아본 결과 배열의 크기에 벗어나는 값이 입력되면 나오는 error라고 하는 데 추론해본 결과 진짜 난쟁이들을 배열로 넘겨주는 과정에서 error가 난 것 같았다
또한 오름차순 정렬도 굳이 마지막에 할 필요없이 처음에 해도 될 것 같다

📍 idea

생각해보니 아홉 난쟁이들 중에서 진짜 난쟁이를 따로 배열로 넘겨 출력할 필요없이
배열에서 가짜 난쟁이가 있는 순번을 기억한 후 출력을 할 때 그 순번이 온다면 continue를 사용하여 넘기는 식으로 출력하면 문자열 변수 하나를 선언할 필요가 없다!

for (int i = 0; i < 8; i++) //가짜 난쟁이 찾기
	{
		for (int j = i + 1; j < 9; j++)
		{
			if (nan[i] + nan[j] == sum) //x와 y에 가짜 난쟁이의 위치 저장
			{
				x = nan[i];
				y = nan[j];
			}
		}
	}
	for (int i = 0; i < 9; i++)
	{
		if (nan[i] == x || nan[i] == y)
			continue;
		printf("%d\n", nan[i]);
	}

일곱 난쟁이의 키의 합이 100이기 때문에 가짜 난쟁이 둘의 합은 전체-100인 것을 이용

	for (i = 0; i < 9; i++)
	{
		scanf("%d", &nan[i]);
		sum += nan[i];
	}
	sum -= 100; //가짜 난쟁이들의 합

🔑 code

#include<stdio.h>
int main()
{
	int nan[10] = { 0 }; //아홉 난쟁이
	int sum = 0; //아홉 난쟁이 합
	int tmp = 0;
	int i, j;
	int x = 0, y = 0; //가짜 난쟁이
	for (i = 0; i < 9; i++)
	{
		scanf("%d", &nan[i]);
		sum += nan[i];
	}
	sum -= 100; //가짜 난쟁이들의 합
	for (int i = 0; i < 8; i++) //오름차순 정렬
	{
		for (int j = i + 1; j < 9; j++)
		{
			if (nan[i] > nan[j])
			{
				tmp = nan[i];
				nan[i] = nan[j];
				nan[j] = tmp;
			}
		}
	}
	for (int i = 0; i < 8; i++) //가짜 난쟁이 찾기
	{
		for (int j = i + 1; j < 9; j++)
		{
			if (nan[i] + nan[j] == sum)
			{
				x = nan[i];
				y = nan[j];
			}
		}
	}
	for (int i = 0; i < 9; i++)
	{
		if (nan[i] == x || nan[i] == y)
			continue;
		printf("%d\n", nan[i]);
	}
}

🎉 후기

continue를 잘 사용하지 못했었는 데 이번 기회에 사용하면서 어떤 경우에 continue를 활용할 수 있는 지 확실하게 알게 된 좋은 시간이였다

profile
junior developer

0개의 댓글