코딩테스트

1436번 영화감독 슘, 2839번 설탕 배달, 2750번 수 정렬하기, 2751번 수 정렬하기2

Cadi 2025. 1. 28. 23:13

코딩테스트 : 1436번 영화감독 슘

문제

666은 종말을 나타내는 수라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다. 하지만 숌은 자신이 조지 루카스와 피터 잭슨을 뛰어넘는다는 것을 보여주기 위해서 영화 제목을 좀 다르게 만들기로 했다.

종말의 수란 어떤 수에 6이 적어도 3개 이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 수는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 이다. 따라서, 숌은 첫 번째 영화의 제목은 "세상의 종말 666", 두 번째 영화의 제목은 "세상의 종말 1666"와 같이 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 수) 와 같다.

숌이 만든 N번째 영화의 제목에 들어간 수를 출력하는 프로그램을 작성하시오. 숌은 이 시리즈를 항상 차례대로 만들고, 다른 영화는 만들지 않는다.

입력

첫째 줄에 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.

 

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
      int number = int.Parse(Console.ReadLine());
      int counter = 0;

      for (int i = 0; i < int.MaxValue; i++)
      {
          string value = i.ToString();

          if (value.Contains("666"))
          {
              counter++;
          }

          if (counter == number)
          {
              Console.WriteLine(value);
              break;
          }
      }
    }
}

 

간단한 노가다로 성공 ! 

 

 

코딩테스트 : 2839번 설탕 배달

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        int number = int.Parse(Console.ReadLine());

        int a = number / 5 + 1;
        int b = number / 3 + 1;

        for (int i = 0; i <= b; i++)
        {
            for (int j = 0; j <= a; j++)
            {
                if (j * 5 + i * 3 == number)
                {
                    Console.WriteLine(i + j);
                    return;
                }
            }
        }
        Console.WriteLine(-1);
        

    }
}

다른 사람의 흥미로운 풀이

비슷한 방식으로,  5로 나눠질 때까지 반복하면서 3씩 빼 주고, 그 값이 0보다 작아진다면 -1을 출력하는 방식도 있었다.

처음에 비슷한 방식을 생각했다가 잘 안될 것 같아서 다른 방식으로 했는데, 이 방식도 좋은 것 같다. 

 


 

진짜 놀라운 사실 : 지금까지 푼 문제들이 브루트 포스라는 카테고리 안에 있었는데 난 사실 이게 무슨 카테고린지 몰랐다.

알고 보니까 그냥 모든 경우의 수를 다 검사하는 것이었다. 이런 카테고린지 알았으면 조금 더 효율적으로 하려고 하지 않고 그냥 검사했을텐데... 아쉬움이 남지만 열심히 고민했으니 패스

그리고 난이도가 약간 이상하다. 실버 5는 엄청 쉽게 풀었는데 비슷한 난이도는 두 시간씩 고민하고 그랬다. 뭐지.

 

 

코딩테스트 : 2750번 수 정렬하기

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        int number = int.Parse(Console.ReadLine());

       int[] numbers = new int[number];

       for (int i = 0; i < number; i++)
       {
           int s = int.Parse(Console.ReadLine());
           numbers[i] = s;
       }
        
       var numbersSorted = numbers.OrderBy(x => x).ToArray();

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

    }
}

 

처음 프로그래머스로 풀 때는 고생했던 문제... 라이브러리가 최고다.

 

 

 

코딩테스트 : 2751번 수 정렬하기2

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        int s = Int32.Parse(Console.ReadLine());
        
        int[] arr = new int[s];

        for (int i = 0; i < arr.Length; i++)
        {
            int a = Int32.Parse(Console.ReadLine());
            arr[i] = a;
        }

        
        var sorted = arr.OrderBy(x => x).ToArray();
        for (int i = 0; i < sorted.Length; i++)
        {
            Console.WriteLine(sorted[i]);
        }
    }
}

 

이렇게 했더니 시간 초과가 떴다.

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        int s = Int32.Parse(Console.ReadLine());
        
        int[] arr = new int[2000001];

        for (int i = 0; i < s; i++)
        {
            int a = Int32.Parse(Console.ReadLine());
            arr[a+ 1000000] = a;
        }

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

 

이렇게 바꿔봤는데에도 시간 초과가 떴다. 

 

이후에도 여러 번의 시도를 거치고, 질문 게시판을 탐독하며 찾아봤다. 

 

Console.WriteLined이 상당히 느린 방식이라 StringBuilder를 사용해 시간을 줄일 수 있었다. 

using System;
using System.Text;

public class Program
{
    public static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        
        bool[] counting = new bool[2000001];
        int offset = 1000000;

        for (int i = 0; i < n; i++)
        {
            int num = int.Parse(Console.ReadLine());
            counting[num + offset] = true;
        }

        // StringBuilder 사용
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < counting.Length; i++)
        {
            if (counting[i])
            {
                sb.AppendLine((i - offset).ToString());
            }
        }
        Console.Write(sb.ToString());
    }
}
 

다른 사람의 흥미로운 풀이

191자짜리 코드가 있어서

아니 진짜요 ???? 이러면서 봤는데 Array.Sort를 하고, Cosole.WriteLine(stirng.Join("\n",m)); 으로 출력을 하셨다.

https://nochoco-lee.tistory.com/505

 

13.3: String.Join 을 이용하여 문자열 배열을 이어붙이기

Section 13.3: String.Join 을 이용하여 문자열 배열을 이어붙이기 String.Join 메소드를 사용하면 문자열 배열 내의 복수개의 요소들을 이어붙일 수 있다 (concatenate). string[] value = {"apple", "orange", "grape", "pea

nochoco-lee.tistory.com

string.Join이라는 함수... 를 처음봤다.

c# 기본 함수들좀 찾아봐야지..