문제
다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.
다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 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
'Algorithm' 카테고리의 다른 글
[백준/C++] 1919 : 애너그램 만들기 (0) | 2022.11.11 |
---|---|
[백준/C++] 11328 : Strfry (0) | 2022.11.11 |
[백준/C++] 3273 : 두 수의 합 (0) | 2022.11.11 |
[바킹독의 실전 알고리즘] 0x02강 - 기초 코드 작성 요령 2 (0) | 2022.10.25 |
[바킹독의 실전 알고리즘] 0x00 ~ 0x01강 (0) | 2022.10.23 |