본문 바로가기
Development/Baekjoon

[C#] 10814번: 나이순 정렬

by Mobics 2025. 10. 26.

목차


    백준 단계별로 풀어보기

    25.10.26

    13단계: 정렬


    10814번: 나이순 정렬

    문제 링크 : https://www.acmicpc.net/problem/10814

     

    문제를 풀기 위해 알아야 할 개념

    >> 튜플, 병합/합병 정렬(Merge Sort)

    : 아래 링크에 자세히 설명해두었다.

     

     

    [C#] 11650번: 좌표 정렬하기

    목차백준 단계별로 풀어보기25.10.2313단계: 정렬11650번: 좌표 정렬하기문제 링크 : https://www.acmicpc.net/problem/11650 문제를 풀기 위해 알아야 할 개념>> 튜플 (Tuple): 여러 데이터 요소를 그룹화하는 간

    mobics.tistory.com

     

    문제 풀이

    : 병합 정렬을 활용하여 나이가 증가하는 순으로 정렬하는데, 입력값을 담을 튜플에 index 값을 추가하여 가입한 순서를 알 수 있게 하고, 만약 나이가 같다면 튜플의 index 가 작은 사람이 앞에 오는 순서로 정렬한다.

    1. 정렬한 값을 임시로 담을 튜플형 배열 temp 를 전역에 선언한다.
    2. StreamReader를 통해 입력값을 받아 int값으로 변환하여 회원 수를 담을 변수 count 에 담고, 회원의 나이, 이름, index 번호를 담을 튜플형 배열 arrcount 의 크기로 초기화하고, 배열 tempcount 의 크기로 초기화한다.
    3. for 반복문을 통해 StreamReader로 받은 나이, 이름, index 를 배열 arr 에 담는다.
    4. 만든 MergeSort 함수를 통해 배열 arr 를 정렬한다.
      •     MergeSortMerge 함수를 만들 때 튜플형 배열을 매개변수로 받도록 한다.
      •     두 회원을 비교할 때, 나이를 먼저 비교하여 나이 순으로 정렬하고, 만약 나이가 같다면 index 를 비교하여 가입한 순으로 정렬한다.
    5. for 반복문을 통해 arr 의 나이와 이름을 StringBuilder에 담고 나서 이를 출력한다.

     

    정답 코드

    using System.IO;
    using System.Text;
    
    class Backjoon
    {
        static (int, string, int)[] temp;
        
        static void Main(string[] args)
        {
            using var sr = new StreamReader(Console.OpenStandardInput());
            using var sw = new StreamWriter(Console.OpenStandardOutput());
            StringBuilder sb = new StringBuilder();
            
            int count = int.Parse(sr.ReadLine());
            (int age, string name, int index)[] arr = new (int, string, int)[count];
            temp = new (int, string, int)[count];
    
            for (int i = 0; i < count; i++)
            {
                string[] input = sr.ReadLine().Split();
                arr[i] = (int.Parse(input[0]), input[1], i);
            }
            
            MergeSort(arr, 0, count - 1);
    
            for (int i = 0; i < count; i++)
            {
                sb.Append(arr[i].age).Append(' ').Append(arr[i].name).Append('\n');
            }
            sw.Write(sb);
        }
    
        static void MergeSort((int age, string name, int index)[] arr, int left, int right)
        {
            if (left < right)
            {
                int mid = (left + right) / 2;
    
                MergeSort(arr, left, mid);
                MergeSort(arr, mid + 1, right);
                Merge(arr, left, mid, right);
            }
        }
    
        static void Merge((int age, string name, int index)[] arr, int left, int mid, int right)
        {
            int i = left;
            int j = mid + 1;
            int k = left;
    
            while (i <= mid && j <= right)
            {
                if (arr[i].age < arr[j].age)
                    temp[k++] = arr[i++];
                else if (arr[i].age == arr[j].age)
                {
                    if (arr[i].index < arr[j].index)
                        temp[k++] = arr[i++];
                    else
                        temp[k++] = arr[j++];
                }
                else
                    temp[k++] = arr[j++];
            }
    
            while (i <= mid)
                temp[k++] = arr[i++];
            while (j <= right)
                temp[k++] = arr[j++];
    
            for (int l = left; l <= right; l++)
            {
                arr[l] = temp[l];
            }
        }
    }

    'Development > Baekjoon' 카테고리의 다른 글

    [C#] 10815번: 숫자 카드  (0) 2025.10.28
    [C#] 18870번: 좌표 압축  (0) 2025.10.27
    [C#] 1181번: 단어 정렬  (0) 2025.10.25
    [C#] 11651번: 좌표 정렬하기 2  (0) 2025.10.24
    [C#] 11650번: 좌표 정렬하기  (0) 2025.10.23