백준 1475번 문제 바로가기

서론

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))