방번호 문제 풀기

2018, May 16    

백준에 있는 방번호 풀어보았다. 문제링크

크게 두 가지 방법이 있는거 같다.

먼저 string으로 받아서 쪼개는 방법을 해보았다.

void roomNumber()
{
	char roomNumber_[8];
	scanf_s("%s",roomNumber_,8);

	const int length = strlen(roomNumber_);

	//하나하나 쪼개기
	int* roomNumber = new int[length];

	for (int i = 0; i < length; i++)
	{
		char a = roomNumber_[i];
		roomNumber[i] = atoi(&a);
		printf("%d\n",roomNumber[i]);
	}

	int countArray[10] = { 0 };

	// 숫자 세기
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < length; j++)
		{
			if (i == roomNumber[j])
				countArray[i]++;
		}
	}

	// 6과 9처리
	int sixAndNine = countArray[6] + countArray[9];
	int sixAndNineNamo = sixAndNine % 2;
	int sixAndNineMok = sixAndNine / 2;
	
	if (sixAndNineNamo != 0)
		sixAndNine = sixAndNineMok + 1;
	else
		sixAndNine = sixAndNineMok;

	countArray[6] = sixAndNine;
	countArray[9] = sixAndNine;

	// 맥스 값 찾기
	int max = 0;
	for(int i=0; i<10; i++)
	{
		if(max < countArray[i])
		{ 
			max = countArray[i];
		}
	}

	printf("%d", max);
	delete[] roomNumber;
}

string을 어떻게 잘 다룰 건지는 더 연구해보아야 할 것 같다.

여기서 더 똑똑한 방법은 나머지를 이용하는 방법이다. 숫자로 입력을 받은 뒤 10으로 나누어가며 슬라이싱을 하면 된다. 나도 질문게시판을 통해 알았다. 소스코드 공유해주신 분 감사합니다~!

void roomNumberUsingNamo()
{
	int cntArray[10] = { 0 };

	int roomNumber = 0;
	scanf_s("%d",&roomNumber);

	int mok = roomNumber / 10;
	int namo = roomNumber % 10;
	
	while (mok != 0 || namo != 0)
	{
		cntArray[namo]++;

		namo = mok % 10;
		mok = mok / 10;
	}

	// 6과 9 처리
	int sixAndNine = cntArray[6] + cntArray[9];
	int sixAndNineNamo = sixAndNine % 2;
	int sixAndNineMok = sixAndNine / 2;

	if (sixAndNineNamo != 0)
		sixAndNine = sixAndNineMok + 1;
	else
		sixAndNine = sixAndNineMok;

	cntArray[6] = sixAndNine;
	cntArray[9] = sixAndNine;

	// max 찾기
	int max = 1;
	for (int i = 0; i < 10; i++)
	{
		if (max < cntArray[i])
			max = cntArray[i];
	}

	printf("%d", max);
}