728x90

문제

제시된 숫자와 거꾸로 나열한 숫자에 사칙연산을 넣은 계산식이 같게하라

(연산자는 최소1번 이상 쓰여야 하며 사칙연산 규칙을 지켜야한다)

351  3*51 =153

621 6*21 = 126

 

난이도

IQ 70

 

목표시간

10분

 

문제풀이(사용언어:C#, 작성도구:VisualStudio2019)

제한시간 내에 풀지 못했다.

문자열 상태에서 모든 경우의 수의 연산자를 대입해서

스택,큐를 이용해서 문자열 식을 후위식으로 전환해서 계산하려고 했다.

 

문제정답(사용언어:python)

1. *를 제외한 다른 연산자를 한번이라도 쓰게되면 4자리를 넘지 못하므로 다른 연산자는 신경쓰지 않아도 된다.

    (999+9 = 1008와 같은 덧셈만 있는 몇가지 경우 4자리를 넘기는 경우가 몇번 있긴 하다 하지만 제외.)


import re

op = ["*",""]

for i in range(1000,10000):
    c = str(i)
    for j in range(0,len(op)):
        for k in range(0,len(op)):
            for l in range(0,len(op)):
                val = c[3] + op[j] + c[2] + op[k] +c[1] + op[l] + c[0]

                # 0으로 시작하는 숫자가 있는지 확인하고 있는 경우 제거
                val = re.sub(r"0(\d+)", r"\1",val)

                #연산자를 하나라도 넣은 경우
                if len(val) >4 :
                    if i == eval(val) :
                        print(val, "=", i);

 

배운점

연산자를 대입하는 경우의 수는 무척 간단했으나.. 문자열 계산기를 단시간에 만들기는 좀 버거웠다.. 그런데 eval()로 문자열 계산을 처리하는 답지를 보니 무척 허탈하다.. api를 소개하는 책인가?;

 

 

728x90
728x90

문제

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)

의 사용으로 짧고 간단하고 이해하기 쉬워진 코드를 보라!

728x90

+ Recent posts