상세 컨텐츠

본문 제목

백준#1138 - 한 줄로 서기

C#/알고리즘

by McRobbin 2020. 4. 13. 18:41

본문

https://www.acmicpc.net/problem/1138

 

1138번: 한 줄로 서기

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다.

www.acmicpc.net

그리디 알고리즘으로 분류된 1138번 한 줄로 서기 문제 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _1138
{
    class Program
    {
        
        static void Main(string[] args)
        {
            //사람수 입력받기.
            int lineLength = int.Parse(Console.ReadLine());
 
            //사람들의 왼쪽으로 큰 사람수 입력.
            string[] splitInput = Console.ReadLine().Split(' ');
 
            //줄을 세워 저장할 lineArray와 입력받은 인풋을 저장할 배열.
            int[] lineArray = new int[lineLength];
            int[] leftArray = new int[lineLength];
 
            //lineArray와 leftArray초기화.
            for (int i = 0; i < lineArray.Length; i++
            {
                lineArray[i] = -1;
                leftArray[i] = int.Parse(splitInput[i]);
            }
 
            for (int i = 0; i < leftArray.Length; i++)
            {
                int count = 0//자신의 왼쪽 사람을 세는 변수.
                int countLine = leftArray[i]; //자신의 정해진 왼쪽 사람 수.
                for(int j = 0; j < leftArray.Length; j++)
                {
                    if(lineArray[j] == -1 && count == countLine)
                    {
                        lineArray[j] = i;
                        break;
                    }
                    if(lineArray[j] == -1)
                    {
                        count++;
                        continue;
                    }
                }
            }
            for (int i = 0; i < lineArray.Length - 1; i++)
                Console.Write((lineArray[i] + 1+ " ");
            Console.Write(lineArray[lineArray.Length - 1+ 1);
        }
    }
}
 
 
 

 

먼저 입력이 키가 작은 순서대로 주어지며 줄을 섰을 때 자기 왼쪽에 몇 명의 큰 사람이 있는지

키 순서대로 주어집니다.

 

줄을 어떻게 세워야 하는지 설명 드리겠습니다. 

 

ex) 7

왼쪽 수 : 3 5 2 0 2 0 0 이런 식으로 예시를 만들었습니다.

다음 줄을 세워놓을 배열을 하나 만들겠습니다.

줄 세움 : -1 -1 -1 -1 -1 -1 -1 저는 -1로 세팅했습니다.

 

1. 우선 첫번째 사람은 키가 가장 작습니다. 왼쪽에 어떤 사람이 오던 상관없이 왼쪽에 서있는 사람의 숫자가

곧 왼쪽의 자신보다 큰 사람 수가 되겠습니다. 그럼 첫 사람은 4번째 위치에 서야 합니다.

 

줄 세움 : -1 -1 -1 1 -1 -1 -1

첫번째 사람은 자기의 위치를 찾아갔습니다.

 

2. 두번째 사람은 1번 사람을 제외 하고는 모두 자신보다 키가 큽니다. 1번 사람은 이미 줄에 서있고

다음에 줄 서는 사람들은 모두 자기보다 키가 클 것입니다. 자기 왼쪽에 새로 줄을 서는 5명이 있어야 함을 의미하며

새로 줄을 서는 사람은 키가 크므로 5자리를 비워두고 줄을 서면 됨을 의미합니다.

 

줄 세움 : -1 -1 -1 -1 -1 2

두번째 사람은 자리를 찾아갔으며 앞으로 다섯개의 빈 자리가 있습니다.

 

3. 세번째 사람은 줄 서있는 1, 2번을 제외하고 다른 사람들보다 키가 작습니다. 새로 줄을 세워야 하는 사람보다

작으며 자신의 왼쪽에 2자리를 비워두면 되겠습니다.

 

줄 세움 : -1 -1 3 1 -1 -1 2

세번째 사람까지 줄을 잘 섰습니다.

 

이런 방식으로 마지막 사람까지 줄을 세우면 되겠습니다. 코딩은 상당히 귀찮으나 아이디어는 간단하니

꼭 직접 코딩 해보시길 바랍니다.

'C# > 알고리즘' 카테고리의 다른 글

백준#1449 - 수리공 항승  (0) 2020.04.16
백준#3052 - 나머지  (0) 2020.04.14
백준#2529 - 부등호  (0) 2020.04.12
백준#1049 - 기타줄  (0) 2020.04.12
백준#1946 - 신입 사원  (0) 2020.04.12

관련글 더보기