문제
다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.
다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 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 등 정수형 자료형끼리 수행할 때만 가능하다.
'코딩테스트 및 개인공부 > 문제풀이' 카테고리의 다른 글
[백준 - 10807번] 개수 세기 (0) | 2022.04.22 |
---|---|
[백준 - 3273번] 두 수의 합 (0) | 2022.04.22 |
[백준 - 2577번] 숫자의 개수 (0) | 2022.04.21 |
[백준 - 10808번] 알파벳 개수 (0) | 2022.04.20 |
[프로그래머스 - level2] [DFS/BFS] 타겟 넘버 (0) | 2022.02.04 |