= BusSimulation =
 * 원래 대안언어 축제 코드 첼린지에 6단계까지 해서 내려던 문제인데(답 검증을 못한 관계로 2단계로 축소후 일부 문제로만 냄) 이왕 만든거 아까워서 이렇게 올림 - [상협]
 * 우리는 보통 버스를 기다릴 때 버스가 한꺼번에 오는 경우를 종종 보게 된다.   버스가 처음에 출발할 때는 일정한 간격으로 출발하였을 텐데 이렇게 몰려다니는 이유는 무엇일까? 이 이유를 컴퓨터로 시물레이션 해본다.  초기 단계에서는 최대한 간단하게 시작해서 점차 현실을 반영하는 시물레이션 으로 만들어 나간다.  하위 단계를 무시하고 다음 단계로 올라갈 수 없으면 순차적으로 시물레이션 단계를 올라간다. 
 * Data Input - 시물레이션 데이터는 busData.txt 와 busStationData.txt 두 가지 로부터 받아들인다. 각 데이터의 값은 단계가 올라감에 따라서 추가되어간다.
 * User Input - 사용자는 자신이 원하는 시간 후의 시물레이션 결과를 볼 수 있다.  시간과 분을 입력받는다.
 * Output - 출력결과는 버스의 위치(단위 meter), 단계에 따라서 승객 수를 출력한다.
== 1 단계 ==
 * 조건 : 버스의 속력, 총운행구간 거리 
 * 문제 :  특정 시간 후의 버스의 위치는?
 * Input 
  * busData.txt
{{{~cpp 
120000 
60   65  72   75   80 
}}}
  * busStationData.txt(시간_초)
{{{~cpp 
60
}}}
 * Output 
{{{~cpp 
1000
1083.33
1200
1250
1333.33
}}}
=== 테스트 ===
{{{~cpp 
2시간 10분
10000   (120000 + 10000 - 120000)
20833.3(130000 + 10830 - 120000)
36000   (144000 + 12000 - 120000)
42500   (150000 + 12500 - 120000)
53333.3(160000 + 13333 - 120000)

5시간 30분
90000
117500
36000
52500
80000
}}}

== 2 단계 조건 ==
 * 추가 조건 : 정류장 위치 데이터 추가, 정류장 너비 데이터 추가, 정류장에서 대기하는 시간 데이터 추가
 * Input 
  * busData.txt
{{{~cpp 
120000 
60   65  72   75   80 
}}}
  * busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함)
{{{~cpp 
5400 12 5 
20000 40000 60000 80000 100000 0 
}}}
 * 버스가 정류장에서 5분간 쉬었다가 이동함
 * 문제 : 특정 시간 후의 버스의 위치는?
 * Output
{{{~cpp 
75000
75833.3
84000
87500
93333.3
}}}

=== 테스트 ===
{{{~cpp 
4시간 30분(270)
100000
100007
12000
28750
40000
}}}
== 3 단계 ==
 * 추가 조건 : 버스가 출발하는 시간 간격 데이터 추가 (24분)
 * 문제 : 특정 시간 후의 버스의 위치는?
 *Input 
  * busData.txt
{{{~cpp 
120000 
60   65  72   75   80 
}}}
  * busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함, 출발하는 간격(분))
{{{~cpp 
5400 12 5 24
20000 40000 60000 80000 100000 0 
}}}
 * Output
{{{~cpp 
75000
55286.1
40000
20000
}}}
=== 테스트 ===
{{{~cpp 

4시간 30분(270)
100000
81536.1
86440
77541.7
60000
}}}
== 4 단계 ==
 * 추가 조건 
  * 정류장에는 1분마다 일정한 수로 사람 수 증가(1명)
  * 버스에 탈수 있는 사람수 제한(70명)
  * 정류장에서 내리는 사람수 데이터 추가(10명)
   *버스가 정류장에 멈추면 현재 정류장에 기다리는 모든 사람을 태우고 이동 
 * 문제 : 특정 시간 후의 버스의 위치 및 버스의 승객수는?
 * Input 
  * busData.txt
{{{~cpp 
120000 
60   65  72   75   80 
}}}
  * busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함, 출발하는 간격(분), 정류장에서 사람 수 증가 율(명/분), 버스에 탈 수 있는 사람 수 ,정류장에서 내리는 사람 수)
{{{~cpp 
5400 12 5 24 1 70 10
20000 40000 60000 80000 100000 0 
}}}
 * Output
{{{~cpp 
75000   70
55286.1  27
40000    28
20000    23
}}}
=== 테스트 ===
{{{~cpp 
4시간 30분(270)
100000    70
81536.1   70
86440      70
77541.7   70
60000      70
}}}
== 5 단계 조건 ==
 * 종점에서는 모든 승객이 내린다. 종점에서는 타는 승객이 없다. (주의 - 아래 InputData에서 원하는 시간을 5400(1시간30분)이 아니라 9600(2시간40분)으로 설정함)
 * Input 
  * busData.txt
{{{~cpp 
120000 
60   65  72   75   80 
}}}
  * busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함, 출발하는 간격(분), 정류장에서 사람 수 증가 율(명/분), 버스에 탈 수 있는 사람 수 ,정류장에서 내리는 사람 수)
{{{~cpp 
9600 12 5 24 1 70 10
20000 40000 60000 80000 100000 0 
}}}
 * Output
{{{~cpp 
10000   0
109453  70
104440  70
85041.7 70
65377.8 46
}}}
 * 문제 : 특정 시간 후의 버스의 위치 및 버스의 승객수는? 
=== 테스트 ===
{{{~cpp 
2시간 40분 160분
10000    0
109453  70
104440  70
85041.7 70
65377.8 46

6시간 10분
60000    70
48202.8 7
60000    70
57541.7 44
45377.8 300      70
}}}
== 6 단계 조건 ==
 *  추가 조건 : 정류장에서 버스에 탑승시 한사람당 걸리는 시간 데이터 추가
 * 문제 : 특정 시간 후의 버스의 위치 및 버스의 승객수는?
 * Input 
  * busData.txt
{{{~cpp 
120000 
60   65  72   75   80 
}}}
  * busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함, 출발하는 간격(분), 정류장에서 사람 수 증가 율(명/분), 버스에 탈 수 있는 사람 수 ,정류장에서 내리는 사람 수, 한사람이 버스에 타는데 걸리는 시간)
{{{~cpp 
9600 12 5 24 1 70 10 7
20000 40000 60000 80000 100000 0 
}}}
 * Output
{{{~cpp 
22266.7  42
10938.9   0
119040   70
95458.3  70
75111.1  46
}}}
=== 테스트 ===
{{{~cpp 
2시간 40분
22266.7  42
10938.9   0
119040   70
95458.3  70
75111.1  46

5시간 40분
65116.7 59
59993.1  70
69840    70
60000    6
47888.9  11

12시간 10분
62100   40
76397.2 70
9120      0
10229.9  46
20000    46

}}} 
=== 결과 분석 ===
 * 버스들이 몰려다니는 것을 확인할 수 있다.
=== ê²°ë¡  ===
 * 물리적인 추측만으로 버스가 연달아 오는 경우를 생각했었는데 이를 실제로 컴퓨터로 시물레이션 함으로써 그러한 현상이 일어나는 과정도 관찰할 수 있었고,  시물레이션 하는 과정에서 여러 가지 조건을 설정하면서 각 조건에 따라서 시물레이션이 어떻게 변할지도 생각해 볼 수도 있었다.   이러한 경험은 생활 속의 물리 현상을 나의 전공과 연계해볼 수도 있구나 하는 신선한 충격이었다.  이러한 일들이 쉬운일은 아니었지만 정말 좋은 경험이 되었다. 

= 나온 소스 =
|| 소스 || 작성자 ||
|| ["BusSimulation/상협"]["BusSimulation/상협(STL)"] ["BusSimulation/상협(STL)2"] || 상협 ||
|| ["BusSimulation/영동"] || 영동 ||
|| ["BusSimulation/태훈zyint"] || 태훈 ||
|| ["BusSimulation/영창"] || 영창 ||
|| ["BusSimulation/조현태"] || [조현태] ||

----
Discrete Event Simulation이 되겠군요. 사람이 몇 명이 기다리느냐, 길 막힘 상태 등은 이산 확률 분포를 사용하면 될 것입니다. NoSmok:TheArtOfComputerProgramming 에서 NoSmok:DonaldKnuth 가 자기 학교 수학과 건물 엘레베이터를 몇 시간 관찰해서 데이타를 수집한 것과 비슷하게 학생들이 직접 84번, 85-1번 등의 버스를 타고 다니면서 자료 수집을 해서 그걸 시뮬레이션 실험하면 아주 많은 공부가 될 것입니다 -- 특히, 어떻게 실세계를 컴퓨터로 옮기느냐 등의 모델링 문제에 관해. 실제로 NoSmok:DonaldKnuth 는 TAOCP에서 이런 연습문제를 만들어 놨습니다. 제가 학부생 때 누군가 이런 숙제를 내줬다면 아마 한 두 계단(see also ["축적과변화"]) 올라설 계기가 되지 않았을까 하고 아쉬울 때가 있습니다. 이 문제에 드는 시간은 하루나 이틀 정도가 되겠지만 여기서 얻은 경험과 지혜는 십 년도 넘게 자신의 프로그래밍 인생에 도움이 될 것이라 믿어 의심치 않습니다. (팀으로 문제 해결을 하면 더 많은 공부가 되겠지요) see also ProgrammingPartyAfterwords 참고자료 --JuNe
----
see also ["데블스캠프2002"]
----
["문제분류"]