변경이력

돌아가기
10 16개 문자 추가

2016/10/16 23:03

이촉즉발 .

루비와 대조되는 하드코딩 버젼 ### JavaScript ```{.javascript} class Truck { constructor(weight, location) { this.weight = (weight || 1); this.location = (location || 0); } Move(dist) { this.location += dist; } } class myArray extends Array { constructor() { super(); } RemoveByIndex(index) { if (index >= 0 && index < this.length) return this.splice(index, 1); } } class Bridge { constructor(length, maxWeight) { this.length = length; this.maxWeight = maxWeight; this.arr = new myArray(); } CalcAllWeight() { var sum = 0; for (var obj of this.arr) sum += obj.weight; return sum; } CheckEntry(nextObj) { if (nextObj.weight > this.maxWeight) return "overweight"; if (this.CalcAllWeight() + nextObj.weight > this.maxWeight) return false; return true; } In(obj) { this.arr.push(obj); } Out() { return this.arr.RemoveByIndex(0); } } class EntrySimulator { constructor() { this.bridge = new Bridge(); this.trucks = new myArray(); } SetOptions(w, L) { //w는 길이, L은 최대하중 this.bridge = new Bridge(w, L); } SetTrucks(arr) { for (var i = 0; i < arr.length; i++) { this.trucks.push(new Truck(parseInt(arr[i]), i)); } } Calculate() { var timediff = 0, passed = 0, entered = 0, error = undefined; while(!error && passed < this.trucks.length) { //이 while문을 한번 돌 때마다 한 턴(unit time)이 지나감. timediff++; for (var i = passed; i < entered; i++) { //다리 위에 올라와있는 트럭들이 먼저 이동함. this.trucks[i].Move(-1); } if (this.trucks[passed].location < -this.bridge.length) { this.bridge.Out(); //다리 위의 제일 앞 트럭이 통과했다면 관련 처리를 함. passed++; } if (entered >= this.trucks.length) //다리에 진입하지 못한 트럭이 더 없다면 뒷부분은 거칠 필요 없음. continue; switch (this.bridge.CheckEntry(this.trucks[entered])) { //다리 앞에 있는 트럭이 다리로 올라올 수 있는지 검사. case true : this.bridge.In(this.trucks[entered]); for (var i = entered; i < this.trucks.length; i++) { //다리 앞의 트럭이 올라왔으므로 그 트럭과 뒤의 모든 트럭들이 한칸씩 이동함. this.trucks[i].Move(-1); } entered++; break; case "overweight" : //입력 단계에서 걸러지지만 언젠가 있을 오류를 대비하여 작성. error = true; alert("초과중량 차량이 있습니다. 현재 초과중량 차량에 대한 대응 메뉴얼이 없습니다."); break; } } return timediff; } } function FilteringResult(plain, num) { //num을 입력하지 않으면 갯수제한 없이 전부 반환함. var arr = plain.split(' ', num); //띄워쓰기를 기준으로 문자열을 나눔. num보다 갯수가 많으면 그 뒤는 버려짐. if (arr.length == 1) arr = arr.split(',', num); //띄워쓰기가 아니라면 쉼표를 기준으로 나눔. console.log(arr); for (var i = 0; i < arr.length; i++) { arr[i] = arr[i].replace(/[^0-9]/g,''); //각 문자열에서 숫자를 제외하고 모두 제거. } console.log(arr); return arr; } function Simulate() { var simulator = new EntrySimulator(); var truck_num = 1, bridge_length, bridge_limit; const MIN_NUM = 1, MAX_NUM = 1000, MIN_LEN = 1, MAX_LEN = 100, MIN_WTL = 10, MAX_WTL = 1000; while (true) { var result = FilteringResult(prompt("Set number of trucks(1 ~ 1000), bridge length(1 ~ 100), bridge max weight(10 ~ 1000). use space or comma as separator.", "4 2 10"), 3); truck_num = result[0]; bridge_length = result[1]; bridge_limit = result[2]; if (truck_num < MIN_NUM) { alert("트럭이 최소 한 대는 있어야 합니다"); //제한에 걸리지 않을 때까지 계속 입력을 반복함. continue; } if (truck_num > MAX_NUM) { alert("트럭의 갯수가 너무 많습니다"); continue; } if (bridge_length < MIN_LEN) { alert("다리의 길이가 너무 짧습니다."); continue; } if (bridge_length > MAX_LEN) { alert("다리의 길이가 너무 깁니다."); continue; } if (bridge_limit < MIN_WTL) { alert("최대 하중이 너무 작습니다."); continue; } if (bridge_limit > MAX_WTL) { alert("최대 하중이 너무 큽니다."); continue; } break; //어떤 제한에도 걸리지 않으면 통과. } simulator.SetOptions(bridge_length, bridge_limit); var trucks; const MIN_TW = 1, MAX_TW = 10; while(true) { var result = FilteringResult(prompt("Input weight of each trucks(1 ~ 10)", "7 4 5 6"), truck_num); var error = false; for (var i = 0; i < result.length; i++) { result[i] = parseInt(result[i]); if (result[i] < MIN_TW) { alert("트럭의 무게가 너무 작습니다."); error = true; break; } if (result[i] > MAX_TW) { alert("트럭의 무게가 너무 큽니다."); error = true; break; } } if (!error) break; } simulator.SetTrucks(result); alert("Result : " + simulator.Calculate() + " unit time"); } window.addEventListener('load', Simulate); ```
루비와 대조되는 하드코딩 버젼 ### JavaScript ```{.javascript} class Truck { constructor(weight, location) { this.weight = (weight || 1); this.location = (location || 0); } Move(dist) { this.location += dist; } } class myArray extends Array { constructor() { super(); } RemoveByIndex(index) { if (index >= 0 && index < this.length) return this.splice(index, 1); } } class Bridge { constructor(length, maxWeight) { this.length = length; this.maxWeight = maxWeight; this.arr = new myArray(); } CalcAllWeight() { var sum = 0; for (var obj of this.arr) sum += obj.weight; return sum; } CheckEntry(nextObj) { if (nextObj.weight > this.maxWeight) return "overweight"; if (this.CalcAllWeight() + nextObj.weight > this.maxWeight) return false; return true; } In(obj) { this.arr.push(obj); } Out() { return this.arr.RemoveByIndex(0); } } class EntrySimulator { constructor() { this.bridge = new Bridge(); this.trucks = new myArray(); } SetOptions(w, L) { //w는 길이, L은 최대하중 this.bridge = new Bridge(w, L); } SetTrucks(arr) { for (var i = 0; i < arr.length; i++) { this.trucks.push(new Truck(parseInt(arr[i]), i)); } } Calculate() { var timediff = 0, passed = 0, entered = 0, error = undefined; while(!error && passed < this.trucks.length) { //이 while문을 한번 돌 때마다 한 턴(unit time)이 지나감. timediff++; for (var i = passed; i < entered; i++) { //다리 위에 올라와있는 트럭들이 먼저 이동함. this.trucks[i].Move(-1); } if (this.trucks[passed].location < -this.bridge.length) { this.bridge.Out(); //다리 위의 제일 앞 트럭이 통과했다면 관련 처리를 함. passed++; } if (entered >= this.trucks.length) //다리에 진입하지 못한 트럭이 더 없다면 뒷부분은 거칠 필요 없음. continue; switch (this.bridge.CheckEntry(this.trucks[entered])) { //다리 앞에 있는 트럭이 다리로 올라올 수 있는지 검사. case true : this.bridge.In(this.trucks[entered]); for (var i = entered; i < this.trucks.length; i++) { //다리 앞의 트럭이 올라왔으므로 그 트럭과 뒤의 모든 트럭들이 한칸씩 이동함. this.trucks[i].Move(-1); } entered++; break; case "overweight" : //입력 단계에서 걸러지지만 언젠가 있을 오류를 대비하여 작성. error = true; alert("초과중량 차량이 있습니다. 현재 초과중량 차량에 대한 대응 메뉴얼이 없습니다."); break; } } return timediff; } } function FilteringResult(plain, num) { //num을 입력하지 않으면 갯수제한 없이 전부 반환함. var arr = plain.split(' ', num); //띄워쓰기를 기준으로 문자열을 나눔. num보다 갯수가 많으면 그 뒤는 버려짐. if (arr.length == 1) arr = arr.split(',', num); //띄워쓰기가 아니라면 쉼표를 기준으로 나눔. console.log(arr); for (var i = 0; i < arr.length; i++) { arr[i] = arr[i].replace(/[^0-9]/g,''); //각 문자열에서 숫자를 제외하고 모두 제거. } console.log(arr); return arr; } function Simulate() { var simulator = new EntrySimulator(); var truck_num = 1, bridge_length, bridge_limit; const MIN_NUM = 1, MAX_NUM = 1000, MIN_LEN = 1, MAX_LEN = 100, MIN_WTL = 10, MAX_WTL = 1000; while (true) { var result = FilteringResult(prompt("Set number of trucks(1 ~ 1000), bridge length(1 ~ 100), bridge max weight(10 ~ 1000). use space or comma as separator.", "4 2 10"), 3); truck_num = result[0]; bridge_length = result[1]; bridge_limit = result[2]; if (truck_num < MIN_NUM) { alert("트럭이 최소 한 대는 있어야 합니다"); //제한에 걸리지 않을 때까지 계속 입력을 반복함. continue; } if (truck_num > MAX_NUM) { alert("트럭의 갯수가 너무 많습니다"); continue; } if (bridge_length < MIN_LEN) { alert("다리의 길이가 너무 짧습니다."); continue; } if (bridge_length > MAX_LEN) { alert("다리의 길이가 너무 깁니다."); continue; } if (bridge_limit < MIN_WTL) { alert("최대 하중이 너무 작습니다."); continue; } if (bridge_limit > MAX_WTL) { alert("최대 하중이 너무 큽니다."); continue; } break; //어떤 제한에도 걸리지 않으면 통과. } simulator.SetOptions(bridge_length, bridge_limit); var trucks; const MIN_TW = 1, MAX_TW = 10; while(true) { var result = FilteringResult(prompt("Input weight of each trucks(1 ~ 10)", "7 4 5 6"), truck_num); var error = false; for (var i = 0; i < result.length; i++) { result[i] = parseInt(result[i]); if (result[i] < MIN_TW) { alert("트럭의 무게가 너무 작습니다."); error = true; break; } if (result[i] > MAX_TW) { alert("트럭의 무게가 너무 큽니다."); error = true; break; } } if (!error) break; } simulator.SetTrucks(result); alert("Result : " + simulator.Calculate() + " unit time"); } window.addEventListener('load', Simulate); ```
9 3개 문자 삭제

2016/10/16 22:38

이촉즉발 .

8 45개 문자 추가

2016/10/16 22:38

이촉즉발 .

7 12개 문자 추가 7개 문자 삭제

2016/10/16 22:37

이촉즉발 .

6 36개 문자 추가

2016/10/16 22:36

이촉즉발 .

5 18개 문자 추가 26개 문자 삭제

2016/10/16 22:34

이촉즉발 .

4 32개 문자 추가 36개 문자 삭제

2016/10/16 22:33

이촉즉발 .

3 3개 문자 추가

2016/10/16 22:30

이촉즉발 .

2 15개 문자 추가

2016/10/16 22:30

이촉즉발 .

1 Original

2016/10/16 22:30

이촉즉발 .

코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.