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 |