※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 14370번 문제인 전화번호 수수께끼 (Large)이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/14370
14370번: 전화번호 수수께끼 (Large)
첫 줄에 테스트케이스의 개수 T가 주어진다. 각 테스트케이스에는 상대방이 제시한 스트링 S가 주어진다. S는 영어 대문자로만 이루어져 있다. 1≤ T ≤ 100이고, S의 길이는 3 이상 2000 이하이다.
www.acmicpc.net
각 한자리 정수를 영어로 표현하면 ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE이다.
이 중 Z가 들어간 단어는 ZERO, W가 들어간 단어는 TWO, U가 들어간 단어는 FOUR, X가 들어간 단어는 SIX, G가 들어간 단어는 EIGHT이 각각 유일하다. 이를 이용해 전화번호에 들어가는 0, 2, 4, 6과 8의 개수를 알아내고 사용한 문자들 제거해주자.
위에 해당하는 철자들을 모두 이용한 뒤, 남은 알파벳들이 나타낼 수 있는 수의 후보는 ONE, THREE, FIVE, SEVEN, NINE이 남는다.
위의 과정과 같은 절차를 걸쳐 1, 3, 5, 7과 9의 개수를 각각 알아내 문제를 해결해주자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int cnt[128];
vector<int> ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
for (int t = 1; t <= T; t++) {
memset(cnt, 0, sizeof(cnt));
string s; cin >> s;
for (auto& l : s) cnt[l]++;
ans.clear();
while (cnt['W']) {
ans.emplace_back(2);
cnt['T']--, cnt['W']--, cnt['O']--;
}
while (cnt['U']) {
ans.emplace_back(4);
cnt['F']--, cnt['O']--, cnt['U']--, cnt['R']--;
}
while (cnt['X']) {
ans.emplace_back(6);
cnt['S']--, cnt['I']--, cnt['X']--;
}
while (cnt['G']) {
ans.emplace_back(8);
cnt['E']--, cnt['I']--, cnt['G']--, cnt['H']--, cnt['T']--;
}
while (cnt['Z']) {
ans.emplace_back(0);
cnt['Z']--, cnt['E']--, cnt['R']--, cnt['O']--;
}
while (cnt['T']) {
ans.emplace_back(3);
cnt['T']--, cnt['H']--, cnt['R']--, cnt['E']-=2;
}
while (cnt['F']) {
ans.emplace_back(5);
cnt['F']--, cnt['I']--, cnt['V']--, cnt['E']--;
}
while (cnt['V']) {
ans.emplace_back(7);
cnt['S']--, cnt['E']-=2, cnt['V']--, cnt['N']--;
}
while (cnt['I']) {
ans.emplace_back(9);
cnt['N']-=2, cnt['I']--, cnt['E']--;
}
while (cnt['O']) {
ans.emplace_back(1);
cnt['O']--, cnt['N']--, cnt['E']--;
}
sort(ans.begin(), ans.end());
cout << "Case #" << t << ": ";
for (auto x : ans) cout << x;
cout << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 14372 // C++] Close Match (Large) (0) | 2023.05.01 |
---|---|
[BOJ 14369 // C++] 전화번호 수수께끼 (Small) (1) | 2023.04.30 |
[BOJ 3007 // C++] 숫자 원 (0) | 2023.04.28 |
[BOJ 7868 // C++] 해밍 수열 (0) | 2023.04.27 |
[BOJ 7869 // C++] 두 원 (0) | 2023.04.26 |