본문 바로가기
코딩테스트 및 개인공부/문제풀이

[백준 - 1475번] 방 번호

by JJPearl 2022. 4. 22.
반응형

문제

다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.

다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)

입력

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 필요한 세트의 개수를 출력한다.

예제 입력 1 복사

9999

예제 출력 1 복사

2

예제 입력 2 복사

122

예제 출력 2 복사

2

예제 입력 3 복사

12635

예제 출력 3 복사

1

예제 입력 4 복사

888888

예제 출력 4 복사

6

 

풀이 과정

더보기

0~9까지 나왔는지 체크하는 배열을 선언.

입력을 자릿수 별로 하나씩 나누어 0~9까지 해당하는 인덱스의 값을 +1

같은 수가 또 나왔다면 세트 +1

6과 9는 똑같으니까 두개가 다 값이 이미 있다면 세트 +1

-> 세트 +1 해줄때 체크 배열의 값들을 다시 0으로 초기화 해줘야된다.

-> 초기화를 위해서 배열마다 값이 1을 초과했다면 setCnt++

초기화 어째할지 고민중;;

 

-> 예제는 다 맞았는데 틀린코드. 반례: 669. 조건 생각이 은근 까다롭다.

int check[10] = {};
	int roomNum = 0;
	int setCnt = 1;

	cin >> roomNum;
	while (roomNum)
	{
		check[roomNum % 10]++;
		
		if (check[roomNum % 10] > 1)
		{
			if (roomNum % 10 == 6)
			{
				if (check[6] && check[9] <= 1)
				{
					check[9]++;
				}
				else
					setCnt++;
				check[6]--;
			}
			else if (roomNum % 10 == 9)
			{
				if (check[9] && check[6] <= 1)
				{
					check[6]++;
				}
				else
					setCnt++;
				check[9]--;
			}
			else
				setCnt++;
		}
		
		roomNum /= 10;
	}
	cout << setCnt;

-> 6과 9를 0.5로 계산하라는 팁을 봤다. check 배열을 float 형으로 선언

-> 699 9999 모두 만족하는 조건을 못찾겠다

 

 

=> 결국 정답 코드 봤는데

나는 체크를 할 때 부터 조건에 따라 나눠서 배열에 넣으려고 했는데

그럴 필요 없고 일단 배열을 다 채운 다음에 

6과 9만 예외로 더해서 올림한 값을 /2 해주면 된다. -> max 함수로 6,9 둘중에 큰값으로 세트 개수를 정하면 되는거였음

 

코드

#include <iostream>
#include <vector>


using namespace std;


int main() {
	int check[10] = {};
	int roomNum = 0;
	int setCnt = 1;

	cin >> roomNum;
	while (roomNum)
	{
		check[roomNum % 10]++;	// 1. 자릿수마다 해당 숫자가 나올때마다 인덱스값 + 해주고
		roomNum /= 10;
	}
	for (int i = 0; i < 10; ++i)
	{
		if (i == 6 || i == 9)
			continue;
		setCnt = max(setCnt, check[i]); // 2. 체크 배열을 돌면서 가장 큰 값으로 필요한 세트 개수 초기화
		
	}
	// * (a[6]+a[9])/2를 올림한 값이 6, 9에 대한 필요한 세트의 수이므로 (a[6]+a[9]+1)/2을 계산
	setCnt = max(setCnt, (check[6] + check[9] + 1) / 2);
	cout << setCnt;
	
}

 

 

알게된 것

 

- 체크하는 배열에서 배열 값이 소수인지를 %(mod)연산으로 알아내려 했는데 C++에서 나머지 연산은 int, long 등 정수형 자료형끼리 수행할 때만 가능하다.

반응형