알고리즘/BOJ

백준 6757번 팰린드롬 진법

꾸준함. 2021. 5. 13. 01:25

문제 링크입니다: 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 자료구조를 사용했습니다.

 

#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;
}
view raw .cpp hosted with ❤ by GitHub

 

개발환경: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