✏️4주차 QUIZ

박시은·2023년 7월 5일
0

JavaScript

목록 보기
35/58
post-thumbnail

▶ Quiz 1. Callback Hell 🔥

제출할 디렉토리 이름ex01/
제출할 파일 이름recipe_callback.js

성결대학교에서 공부를 하고 있는 천민우는 최근 새로나온 전자기기를 구입하기 위해 안양1번가를 전전하며 알바를 구하기 시작하였다.

그 결과 안양1번가의 명물 꽈배기 집에 알바로 들어가게 되었다!

민우는 꽈배기를 만드는 업무에 배정을 받게 되었는데, 꽈배기를 만들려면 다음 아래와 같은 작업을 진행하게 된다.

해당 작업은 아래와 같은 순서와 시간이 걸리게 된다.

  1. 반죽 만들기 - 3초
  2. 1차 발효 - 5초
  3. 성형 하기 - 4.2초
  4. 2차 발효 - 2초
  5. 튀기기 - 5초

민우는 위와 같은 작업을 할 수 있는 js 코드를 구현할려고 한다, 천민우를 도와주자!!!!

  • 각 작업은 setTimeout 함수를 이용하여 구현해야 한다.
  • 매 단계별 console.log 를 이용하여 단계명을 출력해야한다. (이때 실패하였다는 내용도 출력을 해주어야 한다.)
  • 각 작업은 매번 아래의 함수를 호출하여 확률적으로 실패하도록 설계해야 한다.
function randomFail() {
  if (Math.random() < 0.2) throw "제작 실패..!(월급이 삭감되었다 ㅜㅜ)";
}

▷풀이

// 제작 실패시 랜덤 출력
function randomFail() {
  if (Math.random() < 0.2) throw "제작 실패..!(월급이 삭감되었다 ㅜㅜ)";
}

// 반죽 만들기
function makeDough() {
  console.log("반죽 만들기 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        randomFail();
        console.log("반죽 완성!");
        resolve();
      } catch (error) {
        console.log("반죽 만들기 실패...");
        reject(error);
      }
    }, 3000);
  });
}

// 1차 발효
function firstFermentation() {
  console.log("1차 발효 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        randomFail();
        console.log("1차 발효 성공!");
        resolve();
      } catch (error) {
        console.log("1차 발효 실패...");
        reject(error);
      }
    }, 5000);
  });
}

// 성형 하기
function shape() {
  console.log("성형 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        randomFail();
        console.log("성형 성공!");
        resolve();
      } catch (error) {
        console.log("성형 실패...");
        reject(error);
      }
    }, 4200);
  });
}

// 2차 발효
function secondFermentation() {
  console.log("2차 발호 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        randomFail();
        console.log("2차 발효 완료!");
        resolve();
      } catch (error) {
        console.log("2차 발효 실패...");
        reject(error);
      }
    }, 2000);
  });
}

//투기기
function fry() {
  console.log("튀기기 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        randomFail();
        console.log("튀기기 완료!");
        resolve();
      } catch (error) {
        console.log("튀기기 실패...");
        reject(error);
      }
    }, 5000);
  });
}

// 꽈배기 제작
async function make() {
  try {
    await makeDough();
    await firstFermentation();
    await shape();
    await secondFermentation();
    await fry();
    console.log("꽈배기 제작 완료!");
  } catch (error) {
    console.log(error);
  }
}

make();




▶ Quiz 2. 스파게티 스토리

제출할 디렉토리 이름ex02
제출할 파일 이름spaghetti.js

꽈배기 알바만으로 부족했던 민우는 시간을 쪼개 스파게티스토리에서 투잡을 뛰기로 결정했다. 다행히 작업 방식은 꽈배기랑 비슷해 이번에도 JS로 구현하기로 결정했다!


스파게티를 만드는 작업과 소요시간은 다음과 같다.

1️⃣
A. 면 삶기 - 10초

2️⃣
B1. 브로콜리 대치기 - 1초
B2. 마늘과 양파 볶기 - 2초
B3. 배이컨과 햄 볶기 - 2초
B4. 소스, 남은 야채 넣고 다같이 볶기 - 3초

3️⃣
C. 면까지 넣고 다 같이 볶기 - 3초

다만, 작업을 진행할 때 순차적으로 진행하면 만드는데 시간이 오래 걸릴 것 같아, 작업A와 B를 동시에 하면서 A와 B 작업이 모두 끝났을 때 C작업을 하기로 결정했다.


두개의 프로미스를 한번에 실행하려면 각각의 프로미스를 배열에 넣고 Promise.all 함수로 실행시켜주면 된다.

function firstTask() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("첫 번째 작업 완료");
      resolve(1);
    }, 2000);
  });
}

function secondTask() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("두 번째 작업 완료");
      resolve(2);
    }, 3000);
  });
}

async function runTasks() {
  try {
    const results = await Promise.all([firstTask(), secondTask()]);
    console.log("모든 작업 완료, 결과: ", results);
  } catch (error) {
    console.log(error);
  }
}

runTasks();

▷풀이

function boilNoodles() {
  console.log();
  console.log("<---- A 작업 시작 ---->");
  console.log("면 삶기 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("면 삶기 완료");
      console.log("!!!!!!! A 작업 모두 완료 !!!!!!! ");
      console.log();
      resolve();
    }, 1000);
  });
}

function processB1() {
  console.log();
  console.log("<---- B 작업 시작 ---->");
  console.log("브로콜리 대치기 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("브로콜리 대치기 완료");
      resolve();
    }, 1000);
  });
}

function processB2() {
  console.log("마늘과 양파 볶기 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("마늘과 양파 볶기 완료");
      resolve();
    }, 2000);
  });
}

function processB3() {
  console.log("베이컨과 햄 볶기 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("베이컨과 햄 볶기 완료");
      resolve();
    }, 2000);
  });
}

function processB4() {
  console.log("소스, 남은 야채 넣고 다같이 볶기 시작");

  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("소스, 남은 야채 넣고 다같이 볶기 완료");

      resolve();
    }, 3000);
  });
}

async function processB() {
  //B프로세스 4개를 하나씩 처리
  await processB1();
  console.log("");
  await processB2();
  console.log("");
  await processB3();
  console.log("");
  await processB4();

  console.log("!!!!!!! B 작업 모두 완료 !!!!!!!");
  console.log();
}

function mixAllTogether() {
  console.log();
  console.log("<---- C 작업 시작 ---->");
  console.log("면까지 넣고 다 같이 볶기 시작");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("면까지 넣고 다 같이 볶기 완료");
      console.log("!!!!!!! C 작업 모두 완료 !!!!!!!");
      console.log();
      resolve();
    }, 3000);
  });
}

async function makeSpaghetti() {
  try {
    const promiseA = boilNoodles();
    const promiseB = processB();
    await Promise.all([promiseA, promiseB]);
    await mixAllTogether();
    console.log("스파게티 제작 완료!");
    console.log();
  } catch (error) {
    console.log(error);
  }
}

makeSpaghetti();

profile
블로그 이전했습니다!

0개의 댓글