본문 바로가기

Algorithm

[백준/C++] 1475 : 방 번호

   문제   

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

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

 

   입력   

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

 

   출력   

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

 

   예제   

 


   코드   

#include <bits/stdc++.h>
using namespace std;

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);

    // tmp는 6과 9의 개수를 저장할 변수
	int n, ans = 1, tmp = 0;
	int freq[10] = { 0 };

	cin >> n;

    // 0부터 9까지의 빈도 수를 배열 freq에 저장
    while(n){
        freq[n%10]++;
        n /= 10;
    }

    // 6의 빈도수와 9의 빈도수를 합해 tmp에 저장
	for (int i = 0; i < 10; i++) {
		if ((i != 6 && i != 9) && freq[i] > ans) ans = freq[i];
		else if (i == 6 || i == 9) tmp += freq[i];
	}

	//cout << max(ans, int(ceil(tmp / 2.0)));
    cout << max(ans, (tmp + 1) / 2);
}

문자열로 입력받는 방 번호를 처음부터 끝까지 돌며 숫자의 빈도수를 확인하려고한다.

입력받은 숫자 n을 10으로 나누었을 때의 나머지와 몫을 사용해 일의 자리부터 마지막 자리까지 반복문을 돌 수 있다.

6, 9의 빈도수 합인 tmp를 2로 나누고 올림한 값과 ans를 비교했을 때 더 큰 값이 세트의 개수가 된다.

 

나는 2로 나누고 올림을 하기위해 2.0으로 나누고 ceil()을 써주고 정수형으로 변환까지 했지만...

그냥 1을 더해주고 2로 나누면 간단하다.🤣

 

문제 출처: 1475번: 방 번호 (acmicpc.net)
 

1475번: 방 번호

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

www.acmicpc.net