= 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"] ---- ["ë¬¸ì œë¶„ë¥˜"]