본문 바로가기

BOJ

[백준] 1475번 방 번호 c++

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


int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int roomNumber;
	int sum = 0;
	float max = 0;
	cin >> roomNumber;
	float num[10] = { 0, }; //1~9까지 담아줌
	if (roomNumber == 0) { //반례 첫 번째 0이 입력되면 1개를 쓰는거임
		cout << 1;
		return 0;
	}
	while (roomNumber > 0) { //0보다 큰수가 입력이 될 때
		if (roomNumber % 10 == 6 || roomNumber % 10 == 9) { //6과 9는 서로 바꿔 쓸 수 있으니까 6과 9가 나오면 0.5씩 더해줌 생각해보면 말 됨
			num[9] += 0.5;
			roomNumber /= 10;
		}
		else { //6 과 9 아닌 수는 그냥 1씩 더하기
			num[roomNumber % 10]++;
			roomNumber /= 10;
		}
		
	}


	for (int i = 0; i < 10; i++) {
		if (num[i] > max) { //배열에 있는 수들 중에서 가장 큰 수를 찾는다 12345666이면 가장 큰 수가 1.5이다.
			max = num[i];
		}
	}
	if (max == 0.5) { //반례로 6이나 9만 입력되면 max가 0.5가 된다.
		cout << 1;
	}
	else { //그게 아닌 다른 수일 때
		if ((int)(max * 10) % 10 == 0) { // 이렇게 해주는 이유는 소수인지 자연수인지 
			                             //판별 하기 위해서 소수면 10을 곱해서 10으로 나눈 나머지가 0이 아니다.
			cout << max;
		}
		else {//max가 소수이면 예를들어 1.5면 결국 스티커를 2개 사야되니 밑에 식 처럼 해준다
			cout << (int)max + 1;
		}

	}
	return 0;
		
}

 

 

 

자세한 설명은 코드에 주석으로 썼습니다.

반례를 생각하기 어려워서 질문글에서 찾아봄

0,6,9 입력했을 때 1이 나와야 되고

1000000 입력했을 때 6이 나와야 된다.

나는 6과 9의 개수를 0.5로 생각해서 풀었다.

틀렸습니다가 2번 나와버렸다

'BOJ' 카테고리의 다른 글

[백준] 1919번 애너그램 만들기 c++  (0) 2020.04.21
[백준] 11328번 Strfry C++  (0) 2020.04.21
[백준] 13300 방 배정 c++  (0) 2020.04.20
[백준] 10807번 개수 세기 c++  (0) 2020.04.20
[백준] 10808번 알파벳 개수 C++  (0) 2020.04.20