문제 정의
이번 문제는 여러 개의 빌딩이 주어진 상태에서, 빌딩을 정해진 높이 순서대로 쌓아올리는 과정입니다. 각 빌딩은 고유한 높이를 가지며, 그 높이는 정수로 주어집니다. 우리의 목표는 주어진 높이의 순서대로 빌딩을 쌓을 수 있는지의 여부와 그 순서를 출력하는 것입니다.
작성할 알고리즘에 대한 명세는 다음과 같습니다:
- 입력: N개의 빌딩의 높이가 주어진다.
- 가장 먼저 낮은 건물부터 가장 높은 건물에 도달할 수 있게 쌓아야 한다.
- 출력: 가능한 쌓기 순서와 그 순서를 이뤄내는지 여부를 출력한다.
예제
입력
5 3 1 5 4 2
출력
가능 1, 2, 3, 4, 5
입력
3 2 1 2
출력
불가능
문제 풀이 과정
문제를 풀기 위해서는 다음과 같은 과정을 거쳐야 합니다.
- 입력 값 수집: 사용자가 빌딩의 높이를 입력할 수 있도록 합니다.
- 정렬: 빌딩 높이를 오름차순으로 정렬합니다.
- 중복 체크: 동일한 높 품목이 존재하는지 확인합니다. 중복이 존재한다면 불가능으로 판단합니다.
- 출력: 빌딩 쌓기 순서를 출력하고, 가능 여부를 확인하여 사용자에게 알려줍니다.
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를 활용하여 중복 검사와 정렬을 효율적으로 수행할 수 있었습니다. 이러한 유형의 문제를 통해 다양한 자료구조와 알고리즘에 대한 이해도를 높일 수 있습니다. 추가적으로, 다양한 케이스에 대해 코드를 테스트하여 더욱 견고한 구현을 할 수 있도록 연습해보세요.