코딩테스트

코딩 테스트 : 11005번 진법 변환 2, 2720 세탁소 사장 동혁

Cadi 2025. 1. 20. 21:58

코딩테스트 : 11005번 진법 변환 2

문제
10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

입력
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

출력
첫째 줄에 10진법 수 N을 B진법으로 출력한다.

using System.Linq;
using System;
namespace ConsoleApp1
{
    public class Program
    {
        public static void Main()
        {
            string[] s=Console.ReadLine().Split(' ');
            string s1 = s[0];
            string s2 = s[1];
          

            string numbers = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            char[] number = numbers.Select(x => x).ToArray();
            
            string result = "";
            
            double n1 = double.Parse(s1);
            double n2 = double.Parse(s2);
            double last = 1;

            int index = 0;

            for (int i = 0; i < 100; i++)
            {
                
                if (i >= 1)
                {
                    last *= n2;

                }
                if (n1 / last < 1)
                {
                    index = i ;
                    break;
                }
            }
            last = last / n2;
            for (int i = index; i > 0; i--)
            {
                double temp = n1 / last;
                double left = n1 % last;
                n1 = left;
                last = last / n2;          
                int temp1 =(int)temp;
                result += numbers[temp1];
            }
            Console.WriteLine(result);
        }
    }
}

 

전에 풀었던 문제의 역버전, n진법 수를 10진법으로 나타내는 문제에서 10진법을 n진법 수로 나타내는 문제

금방 풀 줄 알았으나 약 1시간 가량이 걸렸다. 그 이유는 다음과 같다.

1. 저번처럼 노가다 형식이 아닌 , 문자와 숫자를 이쁘게 연결하고 싶었다. split을 어떻게 써야 할 지 고민하다 시간 소모

2. n진법 수를 나타낼 때, 낮은 자리의 수부터 표현할 수 있는 방법이 없나 한참 생각했다. 당장은 떠오르지 않아서

일단 처음 봤을 때 생각난 방법대로 풀었다. 

 

 

 

다른 사람의 흥미로운 풀이

 

진짜 간단하게 생각해보니, 예를 들어 1111이 있다고 하면, 10으로 나눈 나머지 1를 집어넣고, 그 몫인 111를 또 나누면 되는 거였다. 무언가 복잡하게 하려고 하다가 잘못된 방식은 아닐지라도, 비효율적인 방식으로 문제를 풀게 되었다. 

 

 

코딩테스트 : 2720 세탁소 사장 동혁

문제

미국으로 유학간 동혁이는 세탁소를 운영하고 있다. 동혁이는 최근에 아르바이트로 고등학생 리암을 채용했다.

동혁이는 리암에게 실망했다.

리암은 거스름돈을 주는 것을 자꾸 실수한다.

심지어 $0.5달러를 줘야하는 경우에 거스름돈으로 $5달러를 주는것이다!

어쩔수 없이 뛰어난 코딩 실력을 발휘해 리암을 도와주는 프로그램을 작성하려고 하지만, 디아블로를 하느라 코딩할 시간이 없어서 이 문제를 읽고 있는 여러분이 대신 해주어야 한다.

거스름돈의 액수가 주어지면 리암이 줘야할 쿼터(Quarter, $0.25)의 개수, 다임(Dime, $0.10)의 개수, 니켈(Nickel, $0.05)의 개수, 페니(Penny, $0.01)의 개수를 구하는 프로그램을 작성하시오. 거스름돈은 항상 $5.00 이하이고, 손님이 받는 동전의 개수를 최소로 하려고 한다. 예를 들어, $1.24를 거슬러 주어야 한다면, 손님은 4쿼터, 2다임, 0니켈, 4페니를 받게 된다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 거스름돈 C를 나타내는 정수 하나로 이루어져 있다. C의 단위는 센트이다. (1달러 = 100센트) (1<=C<=500)

출력

각 테스트케이스에 대해 필요한 쿼터의 개수, 다임의 개수, 니켈의 개수, 페니의 개수를 공백으로 구분하여 출력한다.

namespace ConsoleApp1
{
    public class Program
    {
        public static void Main()
        {
            int n = Int32.Parse(Console.ReadLine());
            string[] answer = new string[n];

            for (int i = 0; i < n; i++)
            {
                string input = Console.ReadLine();
                int number = Int32.Parse(input);
                string result = "";

                if (number >= 25)
                {
                    result += (number / 25).ToString() + " ";
                    number = number % 25;
                }
                else if (number < 25)
                {
                    result += 0 + " ";
                }

                if (number >= 10)
                {
                    result += (number / 10).ToString() + " ";
                    number = number % 10;
                }
                else if (number < 10)
                {
                    result += 0 + " ";
                }

                if (number >= 5)
                {
                    result += (number / 5).ToString() + " ";
                    number = number % 5;
                }
                else if (number < 5)
                {
                    result += 0 + " ";
                }

                result += number.ToString();
                answer[i] = result;
            }

            for (int i = 0; i < answer.Length; i++)
            {
                Console.WriteLine(answer[i]);
            }
        }
    }
}

 

조건 검사를 이렇게 해야하나.. ? 쉬운 문제인데 이렇게 코드가 길 수가 있나.. ? 라고 생각하며 풀었다. 

 

 

다른 사람의 흥미로운 풀이

 

생각해보니, 굳이 조건 검사를 할 필요가 없다. 그냥 나누고 몫이 0이 나오든 말든 더해주고 나머지를 다시 나누면 된다.