'앞뒤 같은 수'란 앞에서부터 읽으나 뒤에서부터 읽으나 동일한 수를 말한다. 수 12321 이 '앞뒤 같은 수'의 예가 될 수 있다.
N(1≤N≤300, 10진수)중에서 N2이 B(2≤B≤20)진수로 표현했을 때, '앞뒤 같은 수'가 될 때의 N과 N2를 B진수로 출력하라.
진수표현에 있어 10, 11 그리고 이상의 수들은 'A','B',...로 표현한다.
진수 B가 들어온다.
N2이 '앞뒤 같은 수'가 되는 모든 수를 B진수로 표기한 N과 N2을 출력한다.
10 | 1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696 |
이번 문제는 결국 1~300까지의 수를 제곱한 값을 진수변환해서 해당 값이 앞, 뒤가 동일한 수인지 확인하여 출력하면 되는 간단한 문제입니다.
바로 직전 문제에서 사용한 함수를 재활용하면 쉽게 진법 변환 처리를 할 수 있으며 변환 결과를 이용해 앞 뒤가 같은지 확인하는 함수만 만들면 됩니다.
input이 300개밖에 되지 않으므로 속도에 대한 걱정은 크게 할 필요는 없어보입니다.
추가적으로 최대 값이 300의 제곱인 90,000이므로 이전에 사용한 long long 형을 사용할 필요 없이 int형으로 처리가 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <iostream> #include <string> #include <stack> #include <map> using namespace std; map<int, char> decimalToChar; void Initialize(); string ToCodedNumber(int num, int code); bool CheckMirror(const string& data); int main() { Initialize(); int code; cin >> code; for (int i = 1; i <= 300; ++i) { // 값의 제곱을 제시된 진수로 변환한다. string result{ ToCodedNumber(i * i, code) }; // 제곱 값이 앞뒤가 같은 수면 출력한다. if (CheckMirror(result)) { cout << ToCodedNumber(i, code) << ' ' << result << endl; } } } void Initialize() { // 진법 변환에 사용할 map을 채워준다. char alpha{ 'A' }; for (int i = 10; i <= 36; ++i) { decimalToChar[i] = alpha; alpha++; } } string ToCodedNumber(int num, int code) { // 자리수를 맞추기 위한 스택 stack<char> tempStack; while (num > 0) { int rest{ num % code }; // 숫자로 사용할 수 있는 경우 if (rest >= 0 && rest <= 9) { tempStack.push(rest + '0'); } // 문자로 변환해야 하는 경우 else { tempStack.push(decimalToChar[rest]); } num /= code; } // 스택을 이용해 자리수를 맞춘다. string result; while (tempStack.size() > 0) { result.push_back(tempStack.top()); tempStack.pop(); } // 결과가 0인경우 0을 결과로 넣어준다. if (result.size() == 0) { result.push_back('0'); } return result; } bool CheckMirror(const string & data) { for (int i = 0; i < data.size(); ++i) { // 대응되는 위치가 같지 않으면 앞뒤가 다름. if (data[i] != data[data.size() - 1 - i]) { return false; } } return true; } | cs |
JUNGOL) 문제은행) 실력키우기) 앞뒤 같은 제곱