반응형

 

1. 문제

 

지하철 시스템은 고객이 다른 두 역을 이동할 때 걸리는 시간을 추적하고 있다.

이 데이터를 이용하여 한 역에서 다른 역으로 이동하는 데 걸리는 평균 시간을 계산한다.

지하철 시스템을 구현하라.

 

- void checkIn(int id, string stationName, int t)

id인 고객이 t 시간에 stationName에 체크인한다.

고객은 같은 시간에 한 역에서만 체크인할 수 있다.

 

- void checkOut(int id, string stationName, int t)

id인 고객이 t 시간에 stationName에서 체크아웃한다.

 

- double getAverageTime(string startStation, string endStation)

startStation에서 endstation으로 가는 평균 시간을 return 한다.

평균 시간은 직접적으로 발생한 startStation에서 endStation으로의 모든 이전 이동에 대해서 계산된다.

즉 startStation에서 checkIn 하고 endStation에서 checkOut을 한 것을 뜻한다.

 

모든 checkIn, checkOut 메서드 호출은 일관적이라고 가정할 수 있다.

고객이 t1에 체크인하고 t2에 체크아웃했다면 t1 < t2이다.

모든 이벤트들은 시간순으로 발생한다.

 

 


 

2. 풀이 과정

 

편리하게 짜기 위해 tuple을 적극 활용하였다.

checkIn 하는 고객을 담는 Dcitionary<id, (stationName, t)> 와

checkOut 하면서 startStation과 endStation, t2 - t1의 누적이 기록되는 Dictionary<(startStation, endStation), List<int>>

 

checkIn은 간단하게 id와 (stationName, t)의 튜플을 add 하는 것으로 끝난다.

 

checkOut을 하면서 (startStation, endStation) 키값이 존재하지 않다면 해당 키에 새로운 리스트를 생성하고 t2 - t1을 누적시킨다.

checkIn 했던 id는 제거한다. 혹시 나중에 또 checkIn 할 수 있으니..?

 

Average를 리턴할 때 정수 나누기 정수여서 정수가 리턴되므로 항 하나에 0.0d를 더해줘서 double로 리턴되게 한다.

 

public class UndergroundSystem {
    Dictionary<int, (string, int)> customerDict;
    Dictionary<(string, string), List<int>> avgDict;

    public UndergroundSystem() {
        customerDict = new();
        avgDict = new();
    }
    
    public void CheckIn(int id, string stationName, int t) {
        customerDict.Add(id, (stationName, t));
    }
    
    public void CheckOut(int id, string stationName, int t) {
        avgDict.TryAdd((customerDict[id].Item1, stationName), new List<int>());
        avgDict[(customerDict[id].Item1, stationName)].Add(t - customerDict[id].Item2);
        customerDict.Remove(id);
    }
    
    public double GetAverageTime(string startStation, string endStation) {
        return avgDict[(startStation, endStation)].Sum() / (avgDict[(startStation, endStation)].Count + 0.0d);
    }
}

 

 

 

 

반응형

'LeetCode 풀이노트' 카테고리의 다른 글

[C#] 1376. Time Needed to Inform All Employees  (0) 2023.06.03
[C#] 1091. Shortest Path in Binary Matrix  (0) 2023.06.01
[C#] 1. Two Sum  (0) 2023.05.30
[C#] 705. Design HashSet  (0) 2023.05.30
[C#] 598. Range Addition II  (0) 2023.05.26