문제

다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.

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

입력

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

출력

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

예제 입력/출력

입력 출력
9999 2
0000 4
99699 3
900966 2

코드1

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main() {
	int cnt = 1;
	string n;
	vector<char> nums;

    // '0' ~ '9' 까지의 숫자(Char형)를 벡터에 저장
	for (char i = '0'; i <= '9'; i++) 
		nums.push_back(i);

	getline(cin, n);

	for (int i = 0; i < n.length(); i++) {

        // 6 or 9인 경우 6혹은 9를 벡터에서 지워줌
		if (n[i] == '6' || n[i] == '9') 
			n[i] = find(nums.begin(), nums.end(), '6') != nums.end() ? '6' : '9';
		
        // 입력받은 n[i]값이 벡터에 존재하는지 여부 확인
		auto pos = find(nums.begin(), nums.end(), n[i]);
		if (pos != nums.end())
			nums.erase(pos);
		else {
			cnt++;
			for (int i = '0'; i <= '9'; i++)
				nums.push_back(i);
			i--;
		}
	}
	
	printf("%d\n", cnt);

	return 0;
}

풀이1

평소에 쓰지 않는 것들을 사용하고 싶어서 String 형식으로 풀어봤다. 평소에 쓰지 않았던 것으로

  1. for문을 char형으로 받아서 직접 ‘0’ ~ ‘9’를 저장한 형식.
  2. 헤더에 ‘algorithm’을 추가하여 find()함수를 사용하고 찾아낸 char를 지우는 형식.

을 사용했다. 사실 조금 복잡하게 푼 느낌이 있다. 숫자 모음(vector nums에 해당)에서 입력받은 숫자와 동일한 것을 발견하면 지우고, 숫자 모음(vector nums에 해당)에서 발견하지 못한다면 count를 추가하여 기존 숫자모음에 새 숫자모음(0~9)를 추가하기 때문이다.

코드2

#include <iostream>
#include <string>

using namespace std;

int main() {
	int cnt = 0;
	string n;
	int nums[10] = { 0, };

	getline(cin, n);

	// 입력받은 숫자들 각각의 등장횟수 카운트
	for (int i = 0; i < n.length(); i++) {
		if (n[i] == '9') // '9'의 값은 '6'으로 카운트
			n[i] = '6';
		nums[n[i] - '0']++;
	}

    // 6과 9는 서로 대체될 수 있기 때문
	nums[6] = (nums[6] + 1) / 2;

	for (int i = 0; i < 10; i++) {
		if (nums[i] > cnt)
			cnt = nums[i];
	}

	printf("%d\n", cnt);

	return 0;
}

풀이2

입력받은 숫자들 각각의 등장횟수를 카운트 해준다.
예를들어 0131이면 nums[0]=1, nums[1]=2, nums[2]=0, nums[3]=1, … 이렇게 된다.
그리고 문제에 나와있듯이 6과 9는 서로 서로 대체될 수 있기 때문에 두개를 같은 숫자이면서 0~9숫자세트에서는 2번을 쓸 수 있는 것으로 간주한다.
그럼 이제 모든 숫자들이 카운트 된 nums배열에서 가장 큰 값을 찾아내면 그것이 필요한 숫자세트의 maximun개수이다. 왜냐하면 가장 많이 쓰이는 숫자X만큼 숫자세트가 필요하기 때문이다.