[책-알고리즘퍼즐68]1.앞뒤가 같은 10진수 만들기(회문)
문제
10진수, 2진수, 8진수 어느 것으로 표현하여도 대칭수가 되는 수 중, 10진수의 10 이상에서의 최솟값을 구해 보세요.
예) 9(10진수)= 1001(진수) = 11(8진수)
난이도
IQ 70
목표시간
10분
문제풀이(사용언어:C#, 작성도구:VisualStudio2019)
//20.01.06
//
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QuizPalindrome
{
class Program
{
public const int MIN_NUM = 10;
static void Main(string[] args)
{
Calculator calc = new Calculator();
for (int i = 1; i < 1000; i++)
{
//10진수
bool isPalindromeDemical = calc.CheckPalindrome(i + "");
Console.Write(i + "/");
//2진수
bool isPalindromeBinary = calc.CheckPalindrome(calc.BinaryFromDemical(i));
Console.Write(calc.BinaryFromDemical(i) + "/");
//8진수
bool isPalindromeOctal = calc.CheckPalindrome(calc.OctalFromDemical(i));
Console.Write(calc.OctalFromDemical(i));
Console.WriteLine("");
//if (i == 9)
//{
// Console.WriteLine(isPalindromeDemical + " " + isPalindromeBinary + " " + isPalindromeOctal);
//}
if (isPalindromeBinary && isPalindromeDemical && isPalindromeOctal)
{
if (i > MIN_NUM)
{
Console.WriteLine("min palindrome :: " + i);
break;
}
}
}
}
}
class Calculator
{
public Calculator()
{
}
public bool CheckPalindrome(string _target)
{
string target = _target;
if(_target.Length == 1)
{
return true;
}
for(int i=0; i<target.Length/2; i++)
{
if(target[i] == target[target.Length -1 -i])
{
}
else
{
return false;
}
}
return true;
}
//10진수를 2진수로 변환한 문자열 얻는 함수
public string BinaryFromDemical(int num)
{
string sBinary = "";
int iDemicalNum = num;
while (true)
{
sBinary += (iDemicalNum%2) + "";
iDemicalNum = (iDemicalNum - (iDemicalNum % 2)) / 2;
if(iDemicalNum < 2)
{
if(iDemicalNum != 0)
{
sBinary += iDemicalNum;
}
break;
}
}
sBinary = ReverseString(sBinary);
return sBinary;
}
//10진수를 8진수로 변환한 문자열을 얻는 함수
public string OctalFromDemical(int num)
{
string sOctal = "";
int iDemicalNum = num;
while (true)
{
sOctal += (iDemicalNum % 8) + "";
iDemicalNum = (iDemicalNum - (iDemicalNum % 8)) / 8;
if (iDemicalNum < 8)
{
if(iDemicalNum != 0)
{
sOctal += iDemicalNum;
}
break;
}
}
sOctal = ReverseString(sOctal);
return sOctal;
}
//문자열 리버스 함수
public string ReverseString(string _target)
{
string sResult = "";
string target = _target;
for(int i= target.Length-1; i>=0; i--)
{
sResult += target[i];
}
return sResult;
}
}
}
문제정답(사용언어:python)
1. 2진수는 무조건 1로 시작하므로 대칭이 되기 위해선 끝자리 역시 무조건 1이 되어야 한다.
2. 따라서 정답은 무조건 홀수이다.
3. 11부터 2씩 증가시키면서 검색한다.
# 11부터 탐색 개시
num = 11
while True:
#진번에 따른 변수를 선언
num_10 = str(num)
num_8 = oct(num).replace("0o","")
num_2 = bin(num).replace("0b","")
#앞뒤가 같은지 확인
if num_10 == num_10[::-1]\
and num_8 == num_8[::-1]\
and num_2 == num_2[::-1]:
break
#홀수만 탐색하므로 2씩 늘림
num += 2
배운점
파이썬 기본 api 함수에 (문자열 역순을 구해주는 함수도 있네..) 놀랐고 c#을 쓰는 본인인 너무 기본적인 api에 무지 했다는 점에 두번 놀랐다.. 코드량의 차이가 이렇게 날 줄이야... 간단한 기능을 하는 api들이야 직접 구현하기에 어려움이 없다고 느껴서 api 사용을 등한시 했었는데.. 이정도로 코드양이 찬다고 생각하니.. 놀랍다..
문제는 무척 심플하고 간단했기 때문에.. 별로 할말이 없다. 정답풀이에서 검색 범위를 홀수로 줄여서 탐색범위를 줄였지만 실무 코드에서는 저런 아이디어를 따로 주석으로 처리해놓지 않으면 오히려 코드 해석하기 힘들거 같기 때문에..
c# 에서 진수변환 처리 해주는 만능 Conver.ToString()이 있다.
물론 문자열을 쉽게 역순으로 전환하는 api 사용법도 있다.
수정
//20.01.06
//
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QuizPalindrome_modified
{
class Program
{
public const int MIN_NUM = 10;
static void Main(string[] args)
{
Calculator calc = new Calculator();
for (int i = 1; i < 1000; i++)
{
//10진수
bool isPalindromeDemical = calc.CheckPalindrome(i + "");
Console.Write(i + "/");
//2진수
bool isPalindromeBinary = calc.CheckPalindrome(Convert.ToString(i,2));
Console.Write(Convert.ToString(i, 2) + "/");
//8진수
bool isPalindromeOctal = calc.CheckPalindrome(Convert.ToString(i,8));
Console.Write(Convert.ToString(i, 8));
Console.WriteLine("");
if (isPalindromeBinary && isPalindromeDemical && isPalindromeOctal)
{
if (i > MIN_NUM)
{
Console.WriteLine("min palindrome :: " + i);
break;
}
}
}
}
}
class Calculator
{
public Calculator()
{
}
public bool CheckPalindrome(string _target)
{
string target = _target;
string reverseTarget = new String(target.ToCharArray().Reverse().ToArray());
if(target == reverseTarget)
{
return true;
}
return false;
}
}
}
new String(target.ToCharArray().Reverse().ToArray());
Convert.ToString(i,2)
의 사용으로 짧고 간단하고 이해하기 쉬워진 코드를 보라!