https://www.acmicpc.net/problem/1475

[필자 사고]
6과 9의 처리가 필요한 문제다.
일단 필자는 각 숫자의 카운트를 저장할 vector에 값을 저장해놨고
6하고 9부분을 (sixCount+ nineCount +1)/2 형태를 이용하여 필요한 set바구니를 만들었다.
이 바구니보다 큰 숫자들 count가 있다면 개내들을 갱신해 주는 형태로 문제를 해결했다.
아래는 자세한 코드 해설이다.
[코드 해설]
- 입력 처리
- 문자열 str을 입력받습니다.
- numbers라는 벡터를 크기 10으로 초기화하여, 각 숫자(0~9)가 몇 번 등장했는지를 저장할 준비를 합니다.
- 문자열을 숫자 개수로 변환
- 입력받은 문자열을 한 글자씩 확인합니다.
- 각 문자를 '0'을 빼서 정수형 숫자로 바꾸고, 해당 숫자의 개수를 numbers[digit]++ 방식으로 카운트합니다.
- 이 과정을 거치면 numbers[i]에는 숫자 i가 등장한 횟수가 저장됩니다.
- 6과 9 특별 처리
- 6과 9는 서로 뒤집어서 쓸 수 있으므로, 두 숫자의 개수를 합쳐서 처리합니다.
- sixCount에는 6의 개수, nineCount에는 9의 개수를 저장합니다.
- (sixCount + nineCount + 1) / 2를 계산하여, 6과 9를 합쳤을 때 필요한 최소 세트 수를 구합니다.
- +1을 더하는 이유는 홀수 개일 때 올림 처리를 하기 위해서입니다.
- 결과 후보 초기화
- 6과 9를 합친 결과를 resultCount에 넣습니다.
- 다른 숫자들과 비교
- 0부터 9까지 반복하면서, 6과 9를 제외한 나머지 숫자의 등장 횟수를 확인합니다.
- 만약 어떤 숫자의 등장 횟수가 resultCount보다 크다면, 그 값으로 resultCount를 갱신합니다.
- 이 과정을 통해 가장 많이 필요한 숫자의 개수를 찾습니다.
- 출력
- 최종적으로 resultCount를 출력합니다.
- 이것이 필요한 세트의 최소 개수입니다.
[소스 코드]
#include <iostream>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
string str;
vector<int> numbers;
int main(void) {
cin >> str;
numbers.assign(10, 0);
for (int i = 0; i < str.size(); i++) {
char ch = str[i] - '0';
numbers[ch]++;
}
int sixCount = numbers[6];
int nineCount = numbers[9];
int midCount =(sixCount + nineCount+1) / 2;
;
int resultCount = midCount;
for (int i = 0; i <= 9; i++) {
if (i == 6 || i == 9)continue;
if (resultCount < numbers[i]) {
resultCount = numbers[i];
}
}
cout << resultCount;
}'백준 > 구현' 카테고리의 다른 글
| 백준 17219 c++ "비밀번호 찾기" -PlusUltraCode- (0) | 2025.09.17 |
|---|---|
| 백준 18258 c++ "큐 2" -PlusUltraCode- (0) | 2025.09.17 |
| 백준 25206 c++ "너의 평점은" -PlusUltraCode- (0) | 2025.09.14 |
| 백준 15653 c++ "구슬 탈출 4" -PlusUltraCode- (4) | 2025.08.27 |
| 백준 17141 c++ "연구소 2" -PlusUltraCode- (2) | 2025.08.25 |