본문 바로가기

백준 문제 풀이

백준 1475번 방 번호 (C++)

728x90

빡구현 문제다. 예외처리를 해주고 너무 쉽게 생각한 것이 문제였다.

처음엔 112233 이런식으로 들어오면 중복할때마다 카운트 1을 쳤다. 그러나 한 "세트" 가 들어오는데 계속 추가하면 비효율적으로 짜게되는 것을 생각해야한다. 

 

그래서 배열을 만들어 각각 숫자가 몇개 들어오는지 파악하고 가장 큰 수의 세트를 현재 필요 세트라고 생각했다.

 

그리고 6,9는 함께 사용가능한 것도 생각해야한다. 처음에는 일일히 예외처리를 해주려 했다가 피를 봤다. 잘 생각해보면 6,9를 적절하게 분배하면 되는 거다. 왜냐면 6,9가 일단 0이 아니라면 세트가 존재한다는 것이기 때문이다. 세트가 존재하지 않으면 추가를 해준다. 

 

틀린코드 : 

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

int main() {
	string str;
	vector<int> vec;
	map<int, int> numbers;
	int sixornine = 0;

	cin >> str;

	for (int i = 0; i < str.size(); i++) {
		vec.push_back(str[i] - '0');
		numbers.insert(make_pair(vec[i], 0));
	}
	/*
	sort(vec.begin(), vec.end());
	int BIG = vec[vec.size() - 1];*/
	
	int answer = -1;

	for (auto i : vec) {
		numbers[i]++;
	}

	for (auto i : numbers) {
		if (answer < i.second) {
			answer = i.second;
		}
	}

	if (answer == numbers[6] || answer == numbers[9]) {
		int tmp = numbers[6] + numbers[9];
		if (tmp % 2 == 0)
			answer = tmp / 2;
		else
			answer = tmp / 2 + 1;
	}

	cout << answer;
}

 

 

맞은 코드 :

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	string str;
	vector<int> vec;
	int numbers[10] = {0,};
	int sixornine = 0;

	cin >> str;

	for (int i = 0; i < str.size(); i++) {
		vec.push_back(str[i] - '0');
	}
	
	int answer = -1;

	for (auto i : vec) {
		if (i == 6) {
			if (numbers[6] > numbers[9])
				numbers[9]++;
			else
				numbers[6]++;
		}
		else if(i == 9) {
			if (numbers[6] < numbers[9])
				numbers[6]++;
			else
				numbers[9]++;
		}
		else {
			numbers[i]++;
		}
	}

	for (int i = 0; i < 10; i++) {
		if (answer < numbers[i]) {
			answer = numbers[i];
		}
	}

	cout << answer;
}