- 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;
}