C#/알고리즘 문제 풀기

프로그래머스 - 호텔 대실

Toa_ 2025. 8. 10. 20:53

 

이번 문제는 HH:MM의 2차원 배열 기반 문제로 접근 방식에 따라 다양한 풀이법이 존재하기 때문에,
내가 좋아하는 문제이며, 이는 기본적으로 Parse 를 통해서 시간을 분리하고 합치는 방식만 숙지하고 있다면 정말 많은 해석방법이 존재한다.

 

 

 

먼저 input 값의 형식을 일관성 있게 입장 시간 순으로 정렬을 하는 것부터 시작하고.

이후 <key == 방번호, value == 나가는 시간> 형식의 딕셔너리를 만들어 처음 입장하면 이후에 빈방인지 체킹 할 때는 나가는 시간을 기준으로 0번째부터 n번째 까지 확인하는 방식으로 구현하였다.

그리고 이때 전체를 돌아도 빈방이 없다면 새로운 방을 만들고 저장하도록 하여 아래와 같이 풀었다.

 

 

 

이때 포인트는

 

1. 방에 저장 할 때에는 는 나가는 시간만 저장하기.
2. 빈 방인지 체크할 때에는 비교할 본체의 시작 시간과 비교할 대상의 나가는 시간을 비교하기.
3. 비교할 대상이 있도록 방 배치 시작 전 0번 방에 시간 0을 미리 배치하기

 

 

 


 

 

 

public int solution(string[,] book_time)
{
    // book_time을 입장 시간 순으로 정렬
    int length = book_time.GetLength(0);
    var timeList = new List<Tuple<string, string>>();

    for (int i = 0; i < length; i++)
    {
        timeList.Add(Tuple.Create(book_time[i, 0], book_time[i, 1]));
    }

    var sorted = timeList.OrderBy(t => TimeToMinutes(t.Item1)).ToArray();

    // 방 배정 시작
    Dictionary<int,int> rooms = new Dictionary<int, int>(); // key : 방번호, value : 끝나는 시간 << 비교시에는 시작하는 시간으로 비교하여 내용물 교체.
    rooms.Add(0, 0); // 방번호 0번은 00:00에 미리 등록

    for (int i = 0; i < sorted.GetLength(0); i++)
    {
        int startTime = TimeToMinutes(sorted[i].Item1); // 시작 시간
        int endTime = TimeToMinutes(sorted[i].Item2); // 끝나는 시간

        // 방번호를 찾기
        int roomNumber = -1;
        for(int j = 0; j < rooms.Count; j++)
        {
            if ((rooms[j] + 10) - startTime <= 0)
            {
                roomNumber = j; // 해당 방 번호를 저장
                break;
            }
        }

        // 사용 가능한 방이 없다면 새 방을 추가
        if (roomNumber == -1) roomNumber = rooms.Count;

        rooms[roomNumber] = endTime;
    }

    return rooms.Count;
}

int TimeToMinutes(string time)
{
    string[] parts = time.Split(':');
    int hours = int.Parse(parts[0]);
    int minutes = int.Parse(parts[1]);
    return hours * 60 + minutes;
}