본문을 작성하는 사람은 주로 C++을 사용합니다.
1. 문제 개요
1-1. 시나리오
1-2. 입력
첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.
1-3. 출력
첫째 줄에 필요한 세트의 개수를 출력한다.
1-4. 문제 링크
https://www.acmicpc.net/problem/1475
2. 풀이
2-1. 문제 이해
이것도 구현 문제네요.
1. 한 세트에는 0부터 9까지 존재한다.
2. 6과 9는 서로 치환할 수 있다.
이 두 가지만 명심하면 충분하겠네요.
🎈 예시
"9999" 라는 값이 들어왔을 경우.
69 69 이렇게 사용해서 2개의 세트만 있으면 됩니다.
"888888" 이라는 값이 들어왔을 경우.
8 8 8 8 8 8 이렇게 사용해서 6개의 세트가 있어야 합니다.
"123456789" 이라는 값이 들어왔을 경우.
123456789 이렇게 사용해서 하나의 세트만 있으면 됩니다.
물론, "123456786" 이어도 하나의 세트만 있으면 되겠죠.
6과 9는 서로 치환이 되니까!
이정도면 이해가 되었나요?
2-2. 코드 작성
이번에도 벡터 자료구조로 풀었습니다.
음.. 언제 한번 VECTOR에 대한 글을 하나 써야겠네요. 가변 배열에 중독되어 버린 김비니군...
우선.. 배열을 선언 해 주도록 합시다..
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> m_Set(10,0);
}
m_Set이라는 이름으로 10개 공간을 가진 정수형 배열을 만들었습니다.
풀이는 간단했어요.
입력되는 숫자를 각 자릿수별로 분해해서, 0~9 사이의 배열의 카운트를 올려줬습니다.
만약 "1215" 라는 값이 들어오면. 아래와 같은 순서로 진행이 되는 거죠.
m_Set : 0 1 0 0 0 0 0 0 0 0 ( "1" )
m_Set : 0 1 1 0 0 0 0 0 0 0 ( "2" )
m_Set : 0 2 1 0 0 0 0 0 0 0 ( "1" )
m_Set : 0 2 1 0 0 1 0 0 0 0 ( "5" )
이걸 코드로 만든다면,
int N;
cin >> N;
while (N != 0)
{
m_Set[N % 10]++;
N /= 10;
}
어때요, 간단하죠?
이다음은, 6과 9의 값을 더해준 다음, 반으로 나눴어요.
왜냐!
이 둘은 한 세트로 상호 보완이 되기 때문!
아까와 같은 예시를 들어볼까요?
만약 반으로 나눈 값을 사용하지 않을 때 "9999"를 입력하면..
m_Set : 0 0 0 0 0 0 0 0 0 1 ( "9" )
m_Set : 0 0 0 0 0 0 0 0 0 2 ( "9" )
m_Set : 0 0 0 0 0 0 0 0 0 3 ( "9" )
m_Set : 0 0 0 0 0 0 0 0 0 4 ( "9" )
이렇게 4개의 세트가 필요하다고 나오죠.
하지만 실상은 2개의 세트만 필요하다는 것!
그래서 반으로 나누는 절차를 진행했습니다.
#include <cmath>
namespace std;
m_Set[6] = round(float((m_Set[6] + m_Set[9])) / 2);
반으로 나눠서, 6번 칸에 덮어씌워줬어요.
❗❗!! 주의할 점 !!❗❗
INT형과 INT형을 나눗셈하게 되면, 소수점 뒷자리를 버리게 됩니다.
5 / 2를 했을 때 결과가 2가 나온다는 말입니다.
하지만 해당 문제의 경우엔 소수점이 있다면 한 세트가 더 필요 한 문제이기 때문에,
반올림을 해 주도록 유도해 주어야 해요.
그래서, cmath 라이브러리의 round 함수를 사용해 줬습니다.
float형 데이터를 넣으면 반올림해서 정수로 반환해 주는 함수랍니다!
그럼.. 이제 됐죠?
m_Set에는 데이터가 모두 들어간 상태일 거고,
이 배열 중 가장 큰 데이터값이 세트 수가 될 겁니다.
#include <algorithm>
namespace std;
int Setcount = *max_element(m_Set.begin(), m_Set.end() - 1);
Vector 데이터 중 가장 큰 수를 찾는 함수는 algorithm 라이브러리의 max_element 함수를 사용해 줬어요.
배열의 길이를 설정해 주면, 그 사이에서 가장 큰 수를 찾아준답니다.
m_Set.end() - 1의 이유는 9번 아이템을 제외하고 검색하기 위해 넣어줬어요!
이러고.. Setcount의 값을 출력해 주기만 하면?
성공~
= 코드 전문 =
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
vector<int> m_Set(10,0);
int N;
cin >> N;
while (N != 0)
{
m_Set[N % 10]++;
N /= 10;
}
m_Set[6] = round(float((m_Set[6] + m_Set[9])) / 2);
int Setcount = *max_element(m_Set.begin(), m_Set.end() - 1);
cout << Setcount;
}
2-2. Github
3. 기억해 둘 부분 및 후기
🎇 Round 함수 (cmath.h)
float, double형태 데이터를 넣으면 반올림된 정수형 데이터를 반환해 준다.
🎇 max_element 함수 (algorithm.h)
배열 데이터를 넣으면 그중 가장 큰 수를 반환 해 준다.
함수에 대한 설명은 차후 추가하겠다.
반대로 min_element도 있다.
C++을 이용한 배열 문제를 풀 때마다 가변 배열인 Vector만 주야장천 쓰고 있다.
솔직히 너무 편하잖아~~~ 고정 배열 귀찮아ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
그래도 나중에는 고정 배열로도 풀어서 코드 업데이트를 해 봐야겠다..
아.. 본문에 있는 컴파일 에러는 round함수 헤더를 써 주지 않아서 나온 오류다.
VS에서는 헤더를 자동 참조?? 해주는 건지 뭔지 오류 없이 실행이 되지만,,
백준에서는 헤더를 따로 입력해 주어야 한다. 이건 Visual Studio에 잠식되어 버린 내 문제다..
오늘도 <구현> 문제를 풀어봤다.
근데 이건 솔직히 너무 쉬워서 풀면서도 실버 5가 맞나???라는 생각이 열댓 번은 든 듯.
'✨ 알고리즘 > 백준' 카테고리의 다른 글
[Silver V] 2563번: 색종이 (C++, 구현) (3) | 2024.01.11 |
---|---|
[Silver V] 4673번: 셀프 넘버 (C++) (0) | 2024.01.08 |
[Bronze V] BOJ 1000. A + B 풀이 (C++) (0) | 2023.05.25 |