Skip to content

Latest commit

ย 

History

History
429 lines (351 loc) ยท 15.3 KB

File metadata and controls

429 lines (351 loc) ยท 15.3 KB

1st Seminar Assignment ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ

image


Level 2

Code

const teammate = {
    members : [{
        name : "์ด  ์†”",
        address : "์ˆ˜์›์‹œ",
        age : 24,
        hobby : "ํด๋ž˜์‹ ์Œ์•… ๊ฐ์ƒ"
      },
      {
        name: "์ตœ์˜์žฌ",
        address: "์šฉ์ธ์‹œ",
        age: 21,
        hobby: "์‹ ๋ฌธ ์ฝ์œผ๋ฉฐ ๋ธŒ๋Ÿฐ์น˜ ์ฆ๊ธฐ๊ธฐ"
      },
      {
        name: "๋ฌธ๊ทœ์›",
        address: "์„ฑ๋‚จ์‹œ",
        age: 23,
        hobby: "๋…์„œ์™€ ํ•จ๊ป˜ํ•˜๋Š” ํ‹ฐํƒ€์ž„"
      },
      {
      name: "ํ—ˆ์œ ์ •",
      address: "์šฉ์ธ์‹œ",
      age: 23,
      hobby: "์ฐจ ๋งˆ์‹œ๋ฉด์„œ ์„œ์˜ˆํ•˜๊ธฐ"
      }],
    printName : function() {
        let nameStr = "์กฐ์› ์ด๋ฆ„ :"
        this.members.forEach(member => {
            nameStr += " " + member.name 
        });
        console.log(nameStr);
    },
    printAddress : function() {
        this.members.forEach(member => {
            console.log(member.name + "์˜ ์ง‘์€? -> " + member.address);
        });
    },
    printAge : function() {
        this.members.forEach(member => {
            console.log(member.name + "์˜ ๋‚˜์ด๋Š” " + member.age+"์‚ด ์ž…๋‹ˆ๋‹ค");
        });
    },
    printHobby : function() {
        this.members.forEach(member => {
            console.log(member.name + "์˜ ์ทจ๋ฏธ๋Š” " + member.hobby);
        });
    },
}

console.log();
console.log(teammate);
console.log();
teammate.printName();
console.log();
teammate.printAddress();
console.log();
teammate.printAge();
console.log();
teammate.printHobby();

Result


members: [
    { name: '์ด  ์†”', address: '์ˆ˜์›์‹œ', age: 24, hobby: 'ํด๋ž˜์‹ ์Œ์•… ๊ฐ์ƒ' },
    { name: '์ตœ์˜์žฌ', address: '์šฉ์ธ์‹œ', age: 21, hobby: '์‹ ๋ฌธ ์ฝ์œผ๋ฉฐ ๋ธŒ๋Ÿฐ์น˜ ์ฆ๊ธฐ๊ธฐ' },
    { name: '๋ฌธ๊ทœ์›', address: '์„ฑ๋‚จ์‹œ', age: 23, hobby: '๋…์„œ์™€ ํ•จ๊ป˜ํ•˜๋Š” ํ‹ฐํƒ€์ž„' },
    { name: 'ํ—ˆ์œ ์ •', address: '์šฉ์ธ์‹œ', age: 23, hobby: '์ฐจ ๋งˆ์‹œ๋ฉด์„œ ์„œ์˜ˆํ•˜๊ธฐ' }
  ],
  printName: [Function: printName],
  printAddress: [Function: printAddress],
  printAge: [Function: printAge],
  printHobby: [Function: printHobby]
}

์กฐ์› ์ด๋ฆ„ : ์ด  ์†” ์ตœ์˜์žฌ ๋ฌธ๊ทœ์› ํ—ˆ์œ ์ •

์ด  ์†”์˜ ์ง‘์€? -> ์ˆ˜์›์‹œ
์ตœ์˜์žฌ์˜ ์ง‘์€? -> ์šฉ์ธ์‹œ
๋ฌธ๊ทœ์›์˜ ์ง‘์€? -> ์„ฑ๋‚จ์‹œ
ํ—ˆ์œ ์ •์˜ ์ง‘์€? -> ์šฉ์ธ์‹œ

์ด  ์†”์˜ ๋‚˜์ด๋Š” 24์‚ด ์ž…๋‹ˆ๋‹ค
์ตœ์˜์žฌ์˜ ๋‚˜์ด๋Š” 21์‚ด ์ž…๋‹ˆ๋‹ค
๋ฌธ๊ทœ์›์˜ ๋‚˜์ด๋Š” 23์‚ด ์ž…๋‹ˆ๋‹ค
ํ—ˆ์œ ์ •์˜ ๋‚˜์ด๋Š” 23์‚ด ์ž…๋‹ˆ๋‹ค

์ด  ์†”์˜ ์ทจ๋ฏธ๋Š” ํด๋ž˜์‹ ์Œ์•… ๊ฐ์ƒ
์ตœ์˜์žฌ์˜ ์ทจ๋ฏธ๋Š” ์‹ ๋ฌธ ์ฝ์œผ๋ฉฐ ๋ธŒ๋Ÿฐ์น˜ ์ฆ๊ธฐ๊ธฐ
๋ฌธ๊ทœ์›์˜ ์ทจ๋ฏธ๋Š” ๋…์„œ์™€ ํ•จ๊ป˜ํ•˜๋Š” ํ‹ฐํƒ€์ž„
ํ—ˆ์œ ์ •์˜ ์ทจ๋ฏธ๋Š” ์ฐจ ๋งˆ์‹œ๋ฉด์„œ ์„œ์˜ˆํ•˜๊ธฐ

Level 3

Code

/**
 * ์šฐ์„  YB,OB๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.
 * ๋žœ๋ค ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์œ„์— ๋งŒ๋“  OB,YB ๋ฆฌ์ŠคํŠธ์˜ ์ˆœ์„œ์„ ์„ž์–ด์ค€๋‹ค.
 *
 * ์›ํ•˜๋Š” ์กฐ๋ณ„ ์ตœ๋Œ€ ์ธ์›์„ ์ •์ˆ˜๋กœ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค!
 * ๊ทธ๋Ÿผ ์ด ๋ช‡๊ฐœ์˜ ์กฐ๊ฐ€ ์งœ์—ฌ์ง€๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์กฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋นˆ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
 *
 * ์ดํ›„ OB ๋จผ์ € ๊ฐ ์กฐ์— ๋ฐฐ์น˜ํ•˜๊ณ , ์ด์–ด์„œ YB๋“ค์„ ์ด์–ด์„œ ์กฐ์— ์ฐจ๋ก€๋กœ ๋ฐฐ์น˜ํ•ด์ค€๋‹ค.
 * ๋งŒ์ผ ํ•ด๋‹น ์กฐ์˜ ์ตœ๋‹ค ์ธ์›์ด ๋‹ค ์ฐจ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š”, ์ž๋ฆฌ๊ฐ€ ๋‚จ์€ ๊ณณ์— YB ์ธ์›์„ ๋ฐฐ์น˜์‹œํ‚จ๋‹ค.
 */

// members ๋ฐ์ดํ„ฐ import
import members from "./members.js";

// ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›๊ธฐ ์œ„ํ•ด "readline" ๋ชจ๋“ˆ์„ import ํ•ด์ค€๋‹ค.
import readline from "readline";

// ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

// ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ ์ˆœ์„œ๋“ค์„ ๋ฌด์ž‘์œ„๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ํ•จ์ˆ˜ --> ํ”ผ์…”-์˜ˆ์ด์ธ  ์…”ํ”Œ(Fisher-Yates shuffle)
function shuffle(array) {
  for (let index = array.length - 1; index > 0; index--) {
    // ๋ฌด์ž‘์œ„ index ๊ฐ’์„ ๋งŒ๋“ ๋‹ค. (0 ์ด์ƒ์˜ ๋ฐฐ์—ด ๊ธธ์ด ๊ฐ’)
    const randomPosition = Math.floor(Math.random() * (index + 1));
    // ์ž„์‹œ๋กœ ์›๋ณธ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , randomPosition์„ ์‚ฌ์šฉํ•ด ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ์„ž๋Š”๋‹ค.
    const temporary = array[index];
    array[index] = array[randomPosition];
    array[randomPosition] = temporary;
  }
}

// filter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YB, OB๋ฅผ ๊ตฌ๋ถ„ํ•ด์ค€๋‹ค.
let YBList = members.filter((member) => member.group == "YB");
let OBList = members.filter((member) => member.group == "OB");

// ๊ฐ๊ฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์žฌ๋ฐฐ์—ดํ•œ๋‹ค.
shuffle(YBList);
shuffle(OBList);

// ๋ฉค๋ฒ„, OB, YB๋“ค์˜ ์ธ์›์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
const allMemberCount = members.length;
const YBcount = YBList.length;
const OBcount = OBList.length;

// ์ตœ์ข…์ ์œผ๋กœ ๊ตฌ์„ฑ๋  ํŒ€์˜ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐ๊ฐ’ ์—†์ด ์„ ์–ธํ•ด์ค€๋‹ค.
let teams;

console.log("์„œ๋ฒ„ ํŒŒํŠธ ์ด ์ธ์› : ", allMemberCount);
console.log("์„œ๋ฒ„ ํŒŒํŠธ OB ์ธ์› : ", OBList.length);
console.log("์„œ๋ฒ„ ํŒŒํŠธ YB ์ธ์› : ", YBList.length);

let teamMemberCount; // ์ž…๋ ฅ๋ฐ›์„ ์กฐ์˜ ์ตœ๋Œ€์ธ์›

console.log("\n์กฐ๋ณ„ ์ตœ๋Œ€ ์ธ์›์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");

// rl์€ event-driven ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— rl.close(); ๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ์ด ๋๋‚ฌ์Œ์„ ์•Œ๋ ค์ฃผ์–ด์•ผํ•œ๋‹ค.
// ๋˜ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›์€ ๋’ค์— buildTeam() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก rl.on() ์•ˆ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
rl.on("line", function (line) {
  teamMemberCount = Number(line);
  buildTeam();
  rl.close();
});

// ๋ฉค๋ฒ„๋“ค์˜ ํŒ€์„ ๊พธ๋ฆฌ๋Š” ํ•จ์ˆ˜!
const buildTeam = () => {
  // Math.ceil = ์†Œ์ˆ˜์  ์ดํ•˜ ์˜ฌ๋ฆผ
  let groupCount = Math.ceil(allMemberCount / teamMemberCount);
  console.log(`\n์ด๋ฒˆ ๋ชจ์ž„์€ ์ด ${groupCount}๊ฐœ์˜ ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค!\n`);

  // teams์— ๊ทธ๋ฃน์˜ ์ˆ˜๋งŒํผ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ 
  teams = new Array(groupCount);
  // for๋ฌธ์„ ํ†ตํ•ด teams์˜ ์›์†Œ๋“ค์— ๋ฐฐ์—ด์„ ํ•œ๋ฒˆ ๋” ์„ ์–ธํ•˜์—ฌ 2์ฐจ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
  for (let i = 0; i < groupCount; i++) {
    teams[i] = new Array();
  }
  //   ๊ทธ๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๋ฐฐ์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค
  // teams = [[1์กฐ],[2์กฐ],[3์กฐ],[4์กฐ]...]

  // OB, YB์˜ ๋น„์œจ์„ ์ตœ๋Œ€ํ•œ ๋งž์ถ”์–ด์•ผํ•˜๊ธฐ ๋–„๋ฌธ์— ์šฐ์„  ๊ฐ ์กฐ๋งˆ๋‹ค ๊ณจ๊ณ ๋ฃจ OB๋ฅผ ๋ฟŒ๋ ค์ค€๋‹ค.
  // OB์˜ ์ธ์›๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐจ๋ก€๋กœ ๊ทธ๋ฃน์— ๋„ฃ์–ด์ฃผ๊ณ , ๊ทธ๋ฃน๋ณด๋‹ค ์ธ์›์ด ๋งŽ์€ ๊ฒฝ์šฐ๊ฐ€ ๋‹น์—ฐํžˆ ๋งŽ์œผ๋‹ˆ ๋ชจ๋“  ์กฐ์— OB๊ฐ€ ํ•œ๋ช…์”ฉ ์ฐผ๋‹ค๋ฉด
  // ๋‹ค์‹œ 1์กฐ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋„ฃ์–ด์ฃผ๋„๋ก ํ•˜์˜€๋‹ค.
  for (let i = 0; i < OBcount; i++) {
    teams[i % groupCount].push(OBList[i]);
  }

  // ์ž์‹ ์˜ ์ฐจ๋ก€์ง€๋งŒ, ์กฐ์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๋Š” ์ธ์›๋“ค์„ ์œ„ํ•œ ๋ฐฐ์—ด์„ ์„ ์–ธํ–ˆ๋‹ค
  // ํ•ด๋‹น ๋ฐฐ์—ด์˜ ์‚ฌ์šฉ์€ ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•  ์˜ˆ์ •!
  let surplus = new Array();

  // ๊ฐ ์กฐ์— YB๋ฅผ ์ฑ„์›Œ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์€ OB์™€ ๋™์ผํ•˜๋‹ค.
  // ํ•˜์ง€๋งŒ ํ•˜๋‚˜ ๋” ๊ณ ๋ คํ•ด์•ผํ•  ๊ฒƒ์€, ์šฐ๋ฆฌ๋Š” ์กฐ์— ๋“ค์–ด๊ฐˆ ์ตœ๋Œ€ ์ธ์›์„ ์ฒดํฌํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์ด๋‹ค!
  // ๊ทธ๋ ‡๊ธฐ์— for๋ฌธ ์•ˆ์—์„œ, ํ•ด๋‹น ์ธ์›์ด ๋“ค์–ด๊ฐˆ ์กฐ์˜ ์ธ์›์ด ์ตœ๋Œ€๋กœ ์ฐผ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด์ฃผ๊ณ 
  // ์ž๋ฆฌ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ push๋ฅผ ํ•ด์ฃผ๊ณ , ์ž๋ฆฌ๊ฐ€ ๋‹ค ์ฐผ๋‹ค๋ฉด ์œ„์— ๋งŒ๋“ค์–ด๋‘” surplus ๋ฐฐ์—ด๋กœ push ํ•ด์ค€๋‹ค.
  for (let i = 0; i < YBcount; i++) {
    if (teams[i % groupCount].length != teamMemberCount) {
      teams[i % groupCount].push(YBList[i]);
    } else {
      surplus.push(YBList[i]);
    }
  }

  // YB๊นŒ์ง€ ์ „๋ถ€ ์กฐ์งœ๊ธฐ๋ฅผ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด, ์ตœ์ข…์ ์œผ๋กœ surplus ๋ฐฐ์—ด์— ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.!
  // ํ•œ๋ช…์ด๋ผ๋„ ์žˆ๋‹ค๋ฉด ์•„์ง ์กฐ๋ฅผ ๋ฐฐ์ •๋ฐ›์ง€ ๋ชปํ•œ ์‚ฌ๋žŒ์ด ์žˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋–„๋ฌธ์—
  // ํ•ด๋‹น ์ธ์›์„ ํ™•์ธํ•˜์—ฌ, ์กฐ์˜ ์ตœ๋Œ€ ์ธ์›์„ ๋‹ค ์ฑ„์šฐ์ง€ ์•Š์€ ์กฐ์— ์ฐจ๋ก€๋กœ ๋ฐฐ์ •ํ•œ๋‹ค.
  if (surplus.length != 0) {
    for (let i = 0; i < groupCount; i++) {
      if (teams[i].length < teamMemberCount && surplus.length != 0) {
        teams[i].push(surplus[0]);
        surplus.shift();
      }
    }
  }

  // ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์ค€๋‹ค!
  for (let team in teams) {
    console.log("====================");
    console.log(Number(team) + 1, "์กฐ");
    teams[team].forEach((member) => {
      console.log(`์ด๋ฆ„ : ${member.name} (${member.group})`);
    });
  }
  console.log("====================");
};

Result

์„œ๋ฒ„ ํŒŒํŠธ ์ด ์ธ์› :  37
์„œ๋ฒ„ ํŒŒํŠธ OB ์ธ์› :  16
์„œ๋ฒ„ ํŒŒํŠธ YB ์ธ์› :  21

์กฐ๋ณ„ ์ตœ๋Œ€ ์ธ์›์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.
4 

์ด๋ฒˆ ๋ชจ์ž„์€ ์ด 10๊ฐœ์˜ ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค!

====================
1 ์กฐ
์ด๋ฆ„ : ๋ฐ•ํ˜„์ง€ (OB)
์ด๋ฆ„ : ์žฅ์„œํ˜„ (OB)
์ด๋ฆ„ : ์ฃผํšจ์‹ (YB)
์ด๋ฆ„ : ๋‚จ์ง€์œค (YB)
====================
2 ์กฐ
์ด๋ฆ„ : ์ด๋‹ค์€ (OB)
์ด๋ฆ„ : ์•ˆ์ค€์˜ (OB)
์ด๋ฆ„ : ์ด์ œ์ค€ (YB)
์ด๋ฆ„ : ๊น€์€์ง€ (YB)
====================
3 ์กฐ
์ด๋ฆ„ : ์ฑ„์ •์•„ (OB)
์ด๋ฆ„ : ์˜ค์˜ˆ์› (OB)
์ด๋ฆ„ : ๊น€์˜๊ถŒ (YB)
์ด๋ฆ„ : ์กฐ์žฌํ˜ธ (YB)
====================
4 ์กฐ
์ด๋ฆ„ : ์ •์„คํฌ (OB)
์ด๋ฆ„ : ์กฐ์œค์„œ (OB)
์ด๋ฆ„ : ์ด์Šนํ—Œ (YB)
์ด๋ฆ„ : ์ตœ์ง„์˜ (YB)
====================
5 ์กฐ
์ด๋ฆ„ : ์„œํ˜ธ์˜ (OB)
์ด๋ฆ„ : ๊น€ํฌ๋นˆ (OB)
์ด๋ฆ„ : ๊น€์ง„์šฑ (YB)
์ด๋ฆ„ : ์ด๋™๊ทผ (YB)
====================
6 ์กฐ
์ด๋ฆ„ : ์ด์†” (OB)
์ด๋ฆ„ : ๋ฐ•๋‚˜ํฌ (OB)
์ด๋ฆ„ : ์†์‹œํ˜• (YB)
์ด๋ฆ„ : ๊ตฌ๊ฑด๋ชจ (YB)
====================
7 ์กฐ
์ด๋ฆ„ : ๋ณ€์ฃผํ˜„ (OB)
์ด๋ฆ„ : ์ด์ •์€ (YB)
์ด๋ฆ„ : ์กฐ์ฐฌ์šฐ (YB)
์ด๋ฆ„ : ๋ฐ•์ •ํ˜„ (YB)
====================
8 ์กฐ
์ด๋ฆ„ : ๊ฐ•ํ•œํฌ (OB)
์ด๋ฆ„ : ์ฃผ์–ด์ง„์‚ฌ๋ž‘ (YB)
์ด๋ฆ„ : ๋ฌธ๊ทœ์› (YB)
====================
9 ์กฐ
์ด๋ฆ„ : ์ตœ์˜์žฌ (OB)
์ด๋ฆ„ : ํ—ˆ์œ ์ • (YB)
์ด๋ฆ„ : ์„ค์ง€์› (YB)
====================
10 ์กฐ
์ด๋ฆ„ : ๊ณ ์„ฑ์šฉ (OB)
์ด๋ฆ„ : ์ตœ์œ ๋ฆผ (YB)
์ด๋ฆ„ : ๊ถŒ์„ธํ›ˆ (YB)
====================

๋‚ด๊ฐ€ ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ์นœ๊ตฌ๋“ค ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ

1. Math

math๋Š” ์ˆ˜ํ•™์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์ˆ˜๋‚˜ ํ•จ์ˆ˜๋“ค์„ ๊ตฌํ˜„ํ•ด๋†“์€ ๊ฐ์ฒด์ด๋‹ค!
์ด๋ฒˆ ๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์•Œ๊ฒŒ๋œ Math ๋ฉ”์†Œ๋“œ๋“ค์ด ๋ช‡๊ฐœ ์žˆ๋‹ค.

  • Math.ceil : ์†Œ์ˆ˜์  ์ดํ•˜ ์˜ฌ๋ฆผ

  • Math.floor : ์†Œ์ˆ˜์  ์ดํ•˜ ๋ฒ„๋ฆผ

  • Math.round : ์†Œ์ˆ˜์  ์ดํ•˜ ๋ฐ˜์˜ฌ๋ฆผ

  • Math.randon() : 0 ์ด์ƒ 1 ๋ฏธ๋งŒ์˜ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    Math.random(); // ๊ธฐ๋ณธ ๋žœ๋ค ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ, 0.9569793562433155 
    (Math.random() * 10).toFixed(); // 0 ~ 10 ๋žœ๋ค ์ˆ˜ ๋ฆฌํ„ด(๋ฌธ์ž์—ด) 
    Math.round((Math.random() * 10)); // 0 ~ 10 ๋žœ๋ค ์ˆ˜ ๋ฆฌํ„ด(number)

2. random ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ฐฐ์—ด ์„ž๊ธฐ

level3 ๊ณผ์ œ์—์„œ๋Š” ์กฐ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์งœ๋‚ด์•ผํ•˜๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ง€๊ธˆ ์ง  ์ฝ”๋“œ๋ž‘ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„์„ ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.
OB ์ธ์›์„ ๋ถ„๋ฆฌํ•ด๋†“์€ ๋ฐฐ์—ด OBList์„ ๋‘๊ณ , ์ƒˆ๋กœ์šด ๋ฐฐ์—ด NewOBList๋ฅผ ํ•˜๋‚˜ ๋” ์„ ์–ธ ํ•œ๋’ค,
randomํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž„์˜์˜ index๋ฅผ ๊ตฌํ•ด OBList์—์„œ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์›์†Œ๋ฅผ sliceํ•˜์—ฌ NewOBList์— push ํ•˜๋Š” ๋ฐฉ์‹ ์ด์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ๋“, ์•„๋‹ˆ ๊ทธ๋ƒฅ ์›๋ž˜ ์žˆ๋˜ ๋ฐฐ์—ด์„ ์„ž์–ด๋ฒ„๋ฆฌ๋ฉด ์•ˆ๋˜๋‚˜? ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ๋ฐฉ๋ฒ•์ด ์žˆ๋‚˜ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด์•˜๋‹ค.
๊ทธ๋ ‡๊ฒŒ ๋ฐœ๊ฒฌํ•œ๊ฒŒ ๋ฐ”๋กœ, sort()๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ์‹์ด์—ˆ๋‹ค.

sort() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ์š”์†Œ ๋ฌด์ž‘์œ„๋กœ ์„ž๊ธฐ

function shuffle(array) {
  array.sort(() => Math.random() - 0.5);
}

let arr = [1, 2, 3];
shuffle(arr);

sort()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์„ž์„ ์ˆ˜ ์žˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ sort()ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐ์—ด ์›์†Œ๋ฅผ ์ฐจ๋ก€๋กœ ๋ฐ˜๋ณตํ•ด์„œ ๋น„๊ตํ•ด์„œ ๋ฌด์—‡์ด ํฐ์ง€ ์ž‘์€์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ ์†ŒํŒ…ํ•˜๋Š”๋ฐ,
Math.random() - 0.5๋Š” ์Œ์ˆ˜์™€ ์–‘์ˆ˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ์ •๋ ฌํ•จ์ˆ˜๋Š” ๋ฌด์ž‘์œ„๋กœ ์š”์†Œ๋ฅผ ์ •๋ ฌํ•˜๊ฒŒ ๋œ๋‹ค.
ํ™œ์šฉ๋„ ๊ฐ„๋‹จํ•˜๊ณ  ์ฝ”๋“œ๋„ ์งง์ง€๋งŒ, ๋‚˜๋Š” ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค.

๊ทธ ์ด์œ ๋Š” ??!

๋ชจ๋˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ํŠœํ† ๋ฆฌ์–ผ์— ๋‚˜์™€์žˆ๋Š” ์„ค๋ช…์„ ๋ณด๋ฉด, sort() ๋ฉ”์†Œ๋“œ๋Š” ์…”ํ”Œ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ท ์ผํ•œ ๋นˆ๋„๋กœ ๋žœ๋ค์ •๋ ฌ์„ ์‹œํ‚ฌ์ˆ˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ, ๋ณด๋‹ค ๊ท ์ผํ•œ ๋นˆ๋„์ˆ˜๋กœ ๋žœ๋คํ•œ ๋ฐฐ์—ด์„ ์–ป์–ด๋‚ด๊ธฐ์œ„ํ•ด ํ”ผ์…” ์—์ด์ธ  ์…”ํ”Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Fisher-Yates Shuffle) ์‚ฌ์šฉ์„ ์ถ”์ฒœํ•˜๊ณ  ์žˆ๋‹ค.

ํ”ผ์…” ์—์ด์ธ  ์…”ํ”Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Fisher-Yates Shuffle)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ์š”์†Œ ๋ฌด์ž‘์œ„๋กœ ์„ž๊ธฐ

// ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ ์ˆœ์„œ๋“ค์„ ๋ฌด์ž‘์œ„๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ํ•จ์ˆ˜ --> ํ”ผ์…”-์˜ˆ์ด์ธ  ์…”ํ”Œ(Fisher-Yates shuffle)
function shuffle(array) {
  for (let index = array.length - 1; index > 0; index--) {
    // ๋ฌด์ž‘์œ„ index ๊ฐ’์„ ๋งŒ๋“ ๋‹ค. (0 ์ด์ƒ์˜ ๋ฐฐ์—ด ๊ธธ์ด ๊ฐ’)
    const randomPosition = Math.floor(Math.random() * (index + 1));
    // ์ž„์‹œ๋กœ ์›๋ณธ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , randomPosition์„ ์‚ฌ์šฉํ•ด ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ์„ž๋Š”๋‹ค.
    const temporary = array[index];
    array[index] = array[randomPosition];
    array[randomPosition] = temporary;
  }

์ด๋ฆ„์€ ๊ทธ๋Ÿด๋“ฏ ํ•˜์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ ๊ณผ์ •์€ ๊ฐ„๋‹จํ•˜๋‹ค.
๋ฐฐ์—ด์˜ ๋ ์š”์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด, ํ•˜๋‚˜์”ฉ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋ฉด์„œ randomํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•œ ๋ฌด์ž‘์œ„ ์ธ๋ฑ์Šค์™€ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์š”์†Œ๋ฅผ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•˜๋Š”๊ฒƒ์ด๋‹ค.
sort() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ์„ฑ๋Šฅ์ ์œผ๋กœ๋„ ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ.. ์‚ฌ์‹ค ๋‚˜๋Š” ๋ฌด์ง€์„ฑ ์ฝ”๋”ฉ์„ ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—,, ๊ณผ์—ฐ ์ด๋Ÿฐ ์„ฑ๋Šฅ์  ํšจ์œจ์„ ์–ป์—ˆ์„์ง€๋Š” ์˜๋ฌธ์ด๋‹ค .. ใ…Ž (์ฝ”๋“œ๋ฆฌ๋ทฐํ•ด์ฃผ์„ธ์—ฌ~)

3. ์ฝ˜์†”๋กœ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๊ธฐ!

๋‚˜๋Š” JS ์–ธ์–ด์— ์•„์ง ๋งŽ์ด ๋‚ฏ์„  ํŽธ์ธ๋ฐ, ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ ์ฝ˜์†”์„ ํ†ตํ•ด ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๋Š”๋ฐ์— ๊ทธ๋ ‡๊ฒŒ ์นœ์ ˆํ•œ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค..
level3 ํ’€์ด๋ฅผ ํ•˜๋ฉด์„œ ์กฐ์˜ ์ตœ๋Œ€์ธ์›์„ ์ž…๋ ฅ๋ฐ›์•„ ์กฐ๋ฅผ ์งœ๊ณ  ์‹ถ์—ˆ๊ธฐ์—, ์ฝ˜์†”์„ ํ†ตํ•ด ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๋Š” ๋ฒ•์„ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.

์ฝ”๋“œ์˜ ์ฃผ์„์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๋‚˜๋Š” readline์ด๋ผ๋Š” ๋‚ด์žฅ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

rl.on("line", function (line) {
  teamMemberCount = Number(line);
  buildTeam();
  rl.close();
});

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ๊ฑด line ๊ณผ close() ์ด๋‹ค.
line์€ ํ•œ ์ค„์ด ์ž…๋ ฅ๋˜๋Š” ์ด๋ฒคํŠธ, close๋Š” ์ž…๋ ฅ์ด ๋๋‚ฌ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” ๋ช…๋ น์–ด์ด๋‹ค.
readline๋ชจ๋“ˆ์˜ rl๊ฐ์ฒด๋Š” event-driven ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— rl.close(); ๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ์ด ๋๋‚ฌ์Œ์„ ์•Œ๋ ค์ฃผ์–ด์•ผํ•œ๋‹ค.
๋˜ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›์€ ๋’ค์— buildTeam() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก rl.on() ์•ˆ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

์กฐ๋ฅผ ์งœ๋Š” ํ”„๋กœ๊ทธ๋žจ์€, ์ž…๋ ฅ๋ฐ›์€ ์ˆ˜๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ง์˜ ์ˆœ์„œ๊ฐ€ ๋”์šฑ ์ค‘์š”ํ•˜๋‹ค!
ํŒŒ์ด์ฌ ๊ฐ™์€ ์–ธ์–ด์˜€๋‹ค๋ฉด ์•„๋ฌด ๊ฑฑ์ •์—†์ด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ๋ฅด๋ฅต ์ฝ”๋”ฉํ•˜๋ฉด ๋˜๊ฒ ์ง€๋งŒ,
์šฐ๋ฆฌ๋Š” ๊ณจ๋•Œ๋ฆฌ๋Š” JS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—!
Js์˜ event-driven ๋ผ๋Š” ํŠน์ง•์„ ๋งค๋ฒˆ ์—ผ๋‘์— ๋‘๊ณ  ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•œ๋‹ค ใ… 


์ฐธ๊ณ  ์‚ฌ์ดํŠธ