서론
0~9까지 숫자 세트가 있고, 특정 숫자를 나타내기 위해서 숫자 세트가 몇 개 필요한지 구하는 문제. 여기까지만 주어지면 브론즈
정도의 문제이겠지만, 6과 9는 회전하여 상호 호환 가능하다는 조건이 달아져서 실버
등급이 매겨져있다.
본론
- 주어진 숫자를 하나씩 받기 위해서
strstream
을 사용해도 되겠지만, 그냥 10으로 나눈 몫과 나머지를 이용해서 ‘일의 자리’에서부터 차례대로 숫자를 불러와서 사용했다. - 6, 9의 경우 서로 호환 가능해서 2로 나눈 값을 반올림해야했는데, round 관련 함수가 생각나지 않아서 그냥 2로 나눈 몫과 나머지의 합으로 구했다.
- vec에 각 숫자들의 갯수를 구하고, 최댓값이 곧 숫자 세트의 갯수다 라는 논리로 해결했다.
결론
자동차에 전화번호 남기는 숫자 세트랑 비슷해서 응용해서 다른 문제를 만들수도 있을 듯 하다. (e.g 010-xxxx-xxxx을 만들기 위해 필요한 숫자 세트의 갯수는?) (e.g 숫자 세트 4개를 이용하여 만들 수 있는 숫자의 경우의 수는?)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vec(10);
int n_room;
cin >> n_room;
while (n_room > 0){
vec[n_room%10]++;
n_room/=10;
}
vec[9] = vec[6] + vec[9];
vec[9] = vec[9]/2 + vec[9]%2;
vec[6] = 0;
cout << *max_element(vec.begin(), vec.end());
}
import sys
import math
n = str(sys.stdin.readline().strip())
n_num = [0]*10
for i in n:
n_num[int(i)] += 1
n_num[9] = math.ceil((n_num[6]+n_num[9])/2)
n_num[6] = 0
print(max(n_num))