[백준 1475번] 방 번호 C++ 풀이

문제

다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.
다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다.
다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)

입력

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 필요한 세트의 개수를 출력한다.

내 풀이

#include <bits/stdc++.h>
using namespace std;
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	int N(0); 
	int numArr[10] = { 0 };
	int max(0);
	cin >> N;
	if (N == 0) {
		cout << 1;
		return 0;
	}

	while (N) {
		numArr[N % 10]++;
		N /= 10;
	}
	numArr[9] += numArr[6]; numArr[6] = 0;
	max = numArr[0];
	for (int i = 0; i < 9; i++) {
		if (max < numArr[i]) max = numArr[i];
	}
	if (numArr[9] / 2 >= max) {
		if (numArr[9] % 2 == 1) max = numArr[9] / 2 + 1;
		else max = numArr[9] / 2;
	}
	cout << max;
}

나누기를 이용할 땐 0을 나누는 경우를 예외처리 해주어야 한다.

더 좋은 풀이

#include <bits/stdc++.h>
using namespace std;
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	string s; 
	int numArr[10] = { 0 };
	int max(0);

	cin >> s;
	for (auto e : s) {
		numArr[e - '0']++;
	}
	
	numArr[9] += numArr[6]; numArr[6] = 0;
	max = numArr[0];
	for (int i = 0; i < 9; i++) {
		if (max < numArr[i]) max = numArr[i];
	}
	if (numArr[9] / 2 >= max) {
		if (numArr[9] % 2 == 1) max = numArr[9] / 2 + 1;
		else max = numArr[9] / 2;
	}
	cout << max;
}

string은 문자열로서 배열 + ‘\0’이므로 string으로 받으면 바로 배열로 받은 것과 마찬가지이다.