C# 코딩테스트 강좌, 빌딩 순서 구하기

문제 정의

이번 문제는 여러 개의 빌딩이 주어진 상태에서, 빌딩을 정해진 높이 순서대로 쌓아올리는 과정입니다. 각 빌딩은 고유한 높이를 가지며, 그 높이는 정수로 주어집니다. 우리의 목표는 주어진 높이의 순서대로 빌딩을 쌓을 수 있는지의 여부와 그 순서를 출력하는 것입니다.

작성할 알고리즘에 대한 명세는 다음과 같습니다:

  • 입력: N개의 빌딩의 높이가 주어진다.
  • 가장 먼저 낮은 건물부터 가장 높은 건물에 도달할 수 있게 쌓아야 한다.
  • 출력: 가능한 쌓기 순서와 그 순서를 이뤄내는지 여부를 출력한다.

예제

입력

                5
                3
                1
                5
                4
                2
            

출력

                가능
                1, 2, 3, 4, 5
            

입력

                3
                2
                1
                2
            

출력

                불가능
            

문제 풀이 과정

문제를 풀기 위해서는 다음과 같은 과정을 거쳐야 합니다.

  1. 입력 값 수집: 사용자가 빌딩의 높이를 입력할 수 있도록 합니다.
  2. 정렬: 빌딩 높이를 오름차순으로 정렬합니다.
  3. 중복 체크: 동일한 높 품목이 존재하는지 확인합니다. 중복이 존재한다면 불가능으로 판단합니다.
  4. 출력: 빌딩 쌓기 순서를 출력하고, 가능 여부를 확인하여 사용자에게 알려줍니다.

C# 코드 구현

위의 절차를 바탕으로 C#로 코드를 구현해보겠습니다. 아래는 구현된 코드입니다.

                using System;
                using System.Linq;

                class Program
                {
                    static void Main(string[] args)
                    {
                        int N = Convert.ToInt32(Console.ReadLine());
                        int[] heights = new int[N];

                        for (int i = 0; i < N; i++)
                        {
                            heights[i] = Convert.ToInt32(Console.ReadLine());
                        }

                        var orderedHeights = heights.Distinct().OrderBy(h => h).ToArray();

                        if (orderedHeights.Length != heights.Length)
                        {
                            Console.WriteLine("불가능");
                        }
                        else
                        {
                            Console.WriteLine("가능");
                            Console.WriteLine(string.Join(", ", orderedHeights));
                        }
                    }
                }
            

코드 설명

코드의 주요 부분을 설명하겠습니다.

  • 입력값 수집: 사용자의 입력을 받기 위해 Console.ReadLine() 메소드를 사용하였습니다.
  • 중복 제거 및 정렬: LINQ의 Distinct() 메소드를 사용하여 중복된 값을 제거한 후, OrderBy()로 오름차순으로 정렬합니다.
  • 유효성 체크: 원본 배열과 중복이 제거된 배열의 길이를 비교하여 중복 여부를 체크합니다.
  • 출력: 쌓을 수 있는 순서를 출력하거나, 불가능하다는 메시지를 출력합니다.

결론

이번 강좌를 통해 빌딩 순서를 구하는 알고리즘 문제를 해결하는 과정을 익혔습니다. C#의 배열과 LINQ를 활용하여 중복 검사와 정렬을 효율적으로 수행할 수 있었습니다. 이러한 유형의 문제를 통해 다양한 자료구조와 알고리즘에 대한 이해도를 높일 수 있습니다. 추가적으로, 다양한 케이스에 대해 코드를 테스트하여 더욱 견고한 구현을 할 수 있도록 연습해보세요.