• toc {:toc}

문제

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

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

입력

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

출력

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

출처:https://www.acmicpc.net/problem/1475

풀이

풀이의 주요 특징 ⇒ 6과 9는 함께 사용할 수 있다.

따라서 num[6]+num[9]를 통해 6과 9가 나온 개수의 합으로 세트의 수를 처리한다.

6과 9는 처리했으니 0으로 둔다.

이후 나머지 숫자를 처리해준다.

#include <bits/stdc++.h>
using namespace std;
 
int num[10];
 
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int N, max;
	cin >> N;
	do{
		num[N%10]++;
		N = N/10;
	}while(N!=0);
	
	max = -1;
	
	if(max<(num[6]+num[9])/2){
		if((num[6]+num[9])%2!=0)
			max = (num[6]+num[9]+1)/2;
		else
			max = (num[6]+num[9])/2;
	}
	num[6]=num[9]=0;
	
	for(auto elem : num){
		if(max < elem){
			max = elem;
		}
	}
	cout << max << "\n";
	
	return 0;
}

이 풀이는 6과 9의 처리를 나중으로 미뤘다.

미루는 방법은 continue를 사용하여 처리했다.

++ans는 결국 int이기 때문에 소수점은 버려진다. 이를 이용해 (a[6]+a[9]+1)/2)만을 사용하여 간결화 할 수 있다.

// Authored by : OceanShape
// Co-authored by : BaaaaaaaaaaarkingDog
// http://boj.kr/be312f0135b040c0acf8960181870067
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  
  // ans = 1로 둠으로서 N = 0일때에 대한 예외처리가 자연스럽게 가능해짐
  int N, a[10] = {}, ans = 1;
  cin >> N;
  
  // 자리수 추출
  while(N){
    a[N%10]++;
    N /= 10;
  }
 
  for(int i = 0; i < 10; i++){
    if(i == 6 || i == 9) continue;
    ans = max(ans, a[i]);
  }
  // (a[6]+a[9])/2를 올림한 값이 6, 9에 대한 필요한 세트의 수이므로 (a[6]+a[9]+1)/2을 계산
  ans = max(ans, (a[6]+a[9]+1)/2);
  cout << ans;
}