문제 링크입니다: www.acmicpc.net/problem/6757
6757번: 팰린드롬 진법
첫째 줄에 X가 주어진다. (2 ≤ X ≤ 1,000,000,000)
www.acmicpc.net
오랜만에 푸는 팰린드롬 문제였습니다.
알고리즘은 아래와 같습니다.
1. 2자리 팰린드롬인경우 temp * b + b = X 와 같은 형식입니다. 따라서, X를 b로 나누어떨어질 경우 temp가 X / b - 1이므로 (X / b - 1)진법이 팰린드롬입니다.
2. 3자리 이상 팰린드롬부터는 규칙을 구할 수 없으므로 isPalindrome 메서드를 통해 팰린드롬이 되는 진법을 구해줍니다.
3. 1번과 2번에서 구한 진법들이 중복이 되면 안되고 정렬된 순서로 출력이되야하므로 set 자료구조를 사용했습니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <set> | |
using namespace std; | |
bool isPalindrome(int X, int b) | |
{ | |
vector<int> v; | |
while (X) | |
{ | |
v.push_back(X%b); | |
X /= b; | |
} | |
int vSize = v.size(); | |
for (int i = 0; i < vSize / 2; i++) | |
{ | |
if (v[i] != v[vSize - (i + 1)]) | |
{ | |
return false; | |
} | |
} | |
return true; | |
} | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
int X; | |
cin >> X; | |
set<int> result; | |
for (int b = 2; b * b < X; b++) | |
{ | |
if (isPalindrome(X, b)) | |
{ | |
result.insert(b); | |
} | |
} | |
/* | |
* 2자리 팰린드롬인경우 temp * b + b = X 와 같은 형식 | |
* X / b - 1 이 정수 temp가 되야함 | |
*/ | |
for (int b = 1; b * b + b < X; b++) | |
{ | |
if (X % b == 0) | |
{ | |
result.insert(X / b - 1); | |
} | |
} | |
for (int b : result) | |
{ | |
cout << b << "\n"; | |
} | |
return 0; | |
} |


개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 3034번 앵그리 창영 (0) | 2021.05.14 |
---|---|
백준 3058번 짝수를 찾아라 (0) | 2021.05.14 |
백준 2997번 네 번째 수 (4) | 2021.05.12 |
백준 2991번 사나운 개 (0) | 2021.05.11 |
백준 2985번 세 수 (0) | 2021.05.10 |