본문 바로가기
백준/구현

백준 1475 c++ "방 번호" -PlusUltraCode-

by PlusUltraCode 2025. 9. 14.

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

 

[필자 사고]

6과 9의 처리가 필요한 문제다.

일단 필자는 각 숫자의 카운트를 저장할 vector에 값을 저장해놨고

6하고 9부분을 (sixCount+ nineCount +1)/2 형태를 이용하여 필요한 set바구니를 만들었다.

이 바구니보다 큰 숫자들 count가 있다면 개내들을 갱신해 주는 형태로 문제를 해결했다.

 

아래는 자세한 코드 해설이다.

[코드 해설]

  1. 입력 처리
    • 문자열 str을 입력받습니다.
    • numbers라는 벡터를 크기 10으로 초기화하여, 각 숫자(0~9)가 몇 번 등장했는지를 저장할 준비를 합니다.
  2. 문자열을 숫자 개수로 변환
    • 입력받은 문자열을 한 글자씩 확인합니다.
    • 각 문자를 '0'을 빼서 정수형 숫자로 바꾸고, 해당 숫자의 개수를 numbers[digit]++ 방식으로 카운트합니다.
    • 이 과정을 거치면 numbers[i]에는 숫자 i가 등장한 횟수가 저장됩니다.
  3. 6과 9 특별 처리
    • 6과 9는 서로 뒤집어서 쓸 수 있으므로, 두 숫자의 개수를 합쳐서 처리합니다.
    • sixCount에는 6의 개수, nineCount에는 9의 개수를 저장합니다.
    • (sixCount + nineCount + 1) / 2를 계산하여, 6과 9를 합쳤을 때 필요한 최소 세트 수를 구합니다.
      • +1을 더하는 이유는 홀수 개일 때 올림 처리를 하기 위해서입니다.
  4. 결과 후보 초기화
    • 6과 9를 합친 결과를 resultCount에 넣습니다.
  5. 다른 숫자들과 비교
    • 0부터 9까지 반복하면서, 6과 9를 제외한 나머지 숫자의 등장 횟수를 확인합니다.
    • 만약 어떤 숫자의 등장 횟수가 resultCount보다 크다면, 그 값으로 resultCount를 갱신합니다.
    • 이 과정을 통해 가장 많이 필요한 숫자의 개수를 찾습니다.
  6. 출력
    • 최종적으로 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;
	
}