๐Ÿ“ ์šฐํ…Œ์ฝ” ํ”„๋ฆฌ์ฝ”์Šค ํ”„๋ก ํŠธ์—”๋“œ ๊ณผ์ œ 1์ฃผ์ฐจ

Doozuuยท2023๋…„ 10์›” 24์ผ
0

ํšŒ๊ณ 

๋ชฉ๋ก ๋ณด๊ธฐ
9/13
post-thumbnail

๐Ÿ“Œ ๊ณผ์ œ ์„ค๋ช… - ์ˆซ์ž ์•ผ๊ตฌ

๐Ÿ” ์ง„ํ–‰ ๋ฐฉ์‹

  • ๋ฏธ์…˜์€ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ, ๊ณผ์ œ ์ง„ํ–‰ ์š”๊ตฌ ์‚ฌํ•ญ ์„ธ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
  • ์„ธ ๊ฐœ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ๋‹ค. ํŠนํžˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ๋งŒ๋“ ๋‹ค.
  • ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ์— ๊ธฐ์žฌ๋˜์ง€ ์•Š์€ ๋‚ด์šฉ์€ ์Šค์Šค๋กœ ํŒ๋‹จํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

๐Ÿ“ฎ ๋ฏธ์…˜ ์ œ์ถœ ๋ฐฉ๋ฒ•

  • ๋ฏธ์…˜ ๊ตฌํ˜„์„ ์™„๋ฃŒํ•œ ํ›„ GitHub์„ ํ†ตํ•ด ์ œ์ถœํ•ด์•ผ ํ•œ๋‹ค.
  • GitHub์— ๋ฏธ์…˜์„ ์ œ์ถœํ•œ ํ›„ ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค ์ง€์› ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜์—ฌ ํ”„๋ฆฌ์ฝ”์Šค ๊ณผ์ œ๋ฅผ ์ œ์ถœํ•œ๋‹ค.
    • ์ž์„ธํ•œ ๋ฐฉ๋ฒ•์€ ์ œ์ถœ ๊ฐ€์ด๋“œ ์ฐธ๊ณ 
    • Pull Request๋งŒ ๋ณด๋‚ด๊ณ  ์ง€์› ํ”Œ๋žซํผ์—์„œ ๊ณผ์ œ๋ฅผ ์ œ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ตœ์ข… ์ œ์ถœํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋‹ˆ ์ฃผ์˜ํ•œ๋‹ค.

๐Ÿšจ ๊ณผ์ œ ์ œ์ถœ ์ „ ์ฒดํฌ ๋ฆฌ์ŠคํŠธ - 0์  ๋ฐฉ์ง€

  • ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋ชจ๋‘ ์ •์ƒ์ ์œผ๋กœ ํ–ˆ๋”๋ผ๋„ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋ช…์‹œ๋œ ์ถœ๋ ฅ๊ฐ’ ํ˜•์‹์„ ์ง€ํ‚ค์ง€ ์•Š์„ ๊ฒฝ์šฐ 0์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์™„๋ฃŒํ•œ ๋’ค ์•„๋ž˜ ๊ฐ€์ด๋“œ์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ 0์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ํ™•์ธ ํ›„ ์ œ์ถœํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฐ€์ด๋“œ

  • ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€ ์„ค์น˜๋ฅผ ์œ„ํ•ด Node.js ๋ฒ„์ „ 18.17.1 ์ด์ƒ์ด ํ•„์š”ํ•˜๋‹ค.
  • ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.
npm install
  • ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
npm test

๐Ÿš€ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ

๊ธฐ๋ณธ์ ์œผ๋กœ 1๋ถ€ํ„ฐ 9๊นŒ์ง€ ์„œ๋กœ ๋‹ค๋ฅธ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ 3์ž๋ฆฌ์˜ ์ˆ˜๋ฅผ ๋งž์ถ”๋Š” ๊ฒŒ์ž„์ด๋‹ค.

  • ๊ฐ™์€ ์ˆ˜๊ฐ€ ๊ฐ™์€ ์ž๋ฆฌ์— ์žˆ์œผ๋ฉด ์ŠคํŠธ๋ผ์ดํฌ, ๋‹ค๋ฅธ ์ž๋ฆฌ์— ์žˆ์œผ๋ฉด ๋ณผ, ๊ฐ™์€ ์ˆ˜๊ฐ€ ์ „ํ˜€ ์—†์œผ๋ฉด ๋‚ซ์‹ฑ์ด๋ž€ ํžŒํŠธ๋ฅผ ์–ป๊ณ , ๊ทธ ํžŒํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๋จผ์ € ์ƒ๋Œ€๋ฐฉ(์ปดํ“จํ„ฐ)์˜ ์ˆ˜๋ฅผ ๋งž์ถ”๋ฉด ์Šน๋ฆฌํ•œ๋‹ค.
    • ์˜ˆ) ์ƒ๋Œ€๋ฐฉ(์ปดํ“จํ„ฐ)์˜ ์ˆ˜๊ฐ€ 425์ผ ๋•Œ
      • 123์„ ์ œ์‹œํ•œ ๊ฒฝ์šฐ : 1์ŠคํŠธ๋ผ์ดํฌ
      • 456์„ ์ œ์‹œํ•œ ๊ฒฝ์šฐ : 1๋ณผ 1์ŠคํŠธ๋ผ์ดํฌ
      • 789๋ฅผ ์ œ์‹œํ•œ ๊ฒฝ์šฐ : ๋‚ซ์‹ฑ
  • ์œ„ ์ˆซ์ž ์•ผ๊ตฌ ๊ฒŒ์ž„์—์„œ ์ƒ๋Œ€๋ฐฉ์˜ ์—ญํ• ์„ ์ปดํ“จํ„ฐ๊ฐ€ ํ•œ๋‹ค. ์ปดํ“จํ„ฐ๋Š” 1์—์„œ 9๊นŒ์ง€ ์„œ๋กœ ๋‹ค๋ฅธ ์ž„์˜์˜ ์ˆ˜ 3๊ฐœ๋ฅผ ์„ ํƒํ•œ๋‹ค. ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜๊ณ , ์ปดํ“จํ„ฐ๋Š” ์ž…๋ ฅํ•œ ์ˆซ์ž์— ๋Œ€ํ•œ
    ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ์ด ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด ์ปดํ“จํ„ฐ๊ฐ€ ์„ ํƒํ•œ 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋œ๋‹ค.
  • ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•œ ํ›„ ๊ฒŒ์ž„์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ throw๋ฌธ์„ ์‚ฌ์šฉํ•ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ž…์ถœ๋ ฅ ์š”๊ตฌ ์‚ฌํ•ญ

์ž…๋ ฅ

  • ์„œ๋กœ ๋‹ค๋ฅธ 3์ž๋ฆฌ์˜ ์ˆ˜
  • ๊ฒŒ์ž„์ด ๋๋‚œ ๊ฒฝ์šฐ ์žฌ์‹œ์ž‘/์ข…๋ฃŒ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” 1๊ณผ 2 ์ค‘ ํ•˜๋‚˜์˜ ์ˆ˜

์ถœ๋ ฅ

  • ์ž…๋ ฅํ•œ ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ, ์ŠคํŠธ๋ผ์ดํฌ ๊ฐœ์ˆ˜๋กœ ํ‘œ์‹œ
1๋ณผ 1์ŠคํŠธ๋ผ์ดํฌ
  • ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ
๋‚ซ์‹ฑ
  • 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํž ๊ฒฝ์šฐ
3์ŠคํŠธ๋ผ์ดํฌ
3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ์ข…๋ฃŒ
  • ๊ฒŒ์ž„ ์‹œ์ž‘ ๋ฌธ๊ตฌ ์ถœ๋ ฅ
์ˆซ์ž ์•ผ๊ตฌ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์ˆซ์ž ์•ผ๊ตฌ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” : 123
1๋ณผ 1์ŠคํŠธ๋ผ์ดํฌ
์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” : 145
1๋ณผ
์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” : 671
2๋ณผ
์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” : 216
1์ŠคํŠธ๋ผ์ดํฌ
์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” : 713
3์ŠคํŠธ๋ผ์ดํฌ
3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ์ข…๋ฃŒ
๊ฒŒ์ž„์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด 1, ์ข…๋ฃŒํ•˜๋ ค๋ฉด 2๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.
1
์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” : 123
1๋ณผ
...

๐ŸŽฏ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ

  • Node.js 18.17.1 ๋ฒ„์ „์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. Node.js 18.17.1์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ 0์  ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์˜ ์‹œ์ž‘์ ์€ App.js์˜ play ๋ฉ”์„œ๋“œ์ด๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ์‹œ

const app = new App();
app.play();
  • package.json์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ณ  ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(jQuery, Lodash ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ˆœ์ˆ˜ Vanilla JS๋กœ๋งŒ ๊ตฌํ˜„ํ•œ๋‹ค.
  • JavaScript ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ง€ํ‚ค๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•œ๋‹ค
  • ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์‹œ process.exit()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜๋ฉด ApplicationTest์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ 0์  ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • @woowacourse/mission-utils์˜ Random ๋ฐ Console API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • Random ๊ฐ’ ์ถ”์ถœ์€ Random.pickNumberInRange()๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
    • ์‚ฌ์šฉ์ž์˜ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›๊ณ  ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Console.readLineAsync, Console.print๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ

const computer = [];
while (computer.length < 3) {
  const number = MissionUtils.Random.pickNumberInRange(1, 9);
  if (!computer.includes(number)) {
    computer.push(number);
  }
}

โœ๏ธ ๊ณผ์ œ ์ง„ํ–‰ ์š”๊ตฌ ์‚ฌํ•ญ

  • ๋ฏธ์…˜์€ javascript-baseball ์ €์žฅ์†Œ๋ฅผ Fork & Cloneํ•ด ์‹œ์ž‘ํ•œ๋‹ค.
  • ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „ docs/README.md์— ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ์ •๋ฆฌํ•ด ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ๊ณผ์ œ ์ง„ํ–‰ ๋ฐ ์ œ์ถœ ๋ฐฉ๋ฒ•์€ ํ”„๋ฆฌ์ฝ”์Šค ๊ณผ์ œ ์ œ์ถœ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.



๐Ÿ“ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก

  1. ๋žœ๋ค ์ˆซ์ž ์ƒ์„ฑํ•˜๊ธฐ
  2. ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’ ๋ฐ›๊ธฐ
  3. ์ž…๋ ฅ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌํ•˜๊ธฐ
    • ์ž…๋ ฅ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ : ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅํ•˜๊ธฐ
    • ์ž…๋ ฅ๊ฐ’์ด ์œ ํšจํ•  ๊ฒฝ์šฐ :
      • ์ŠคํŠธ๋ผ์ดํฌ, ๋ณผ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐํ•˜๊ธฐ
      • ๊ณ„์‚ฐ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํžŒํŠธ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅํ•˜๊ธฐ
  4. 3์ŠคํŠธ๋ผ์ดํฌ๊ฐ€ ๋˜๋ฉด ์„ ํƒ ์•ˆ๋‚ดํ•˜๊ธฐ
    • ๊ฒŒ์ž„ ์žฌ์‹œ์ž‘ํ•˜๊ธฐ : 1๋‹จ๊ณ„๋ถ€ํ„ฐ ์žฌ์‹œ์ž‘
    • ๊ฒŒ์ž„ ์ข…๋ฃŒํ•˜๊ธฐ : ๊ฒŒ์ž„ ์ข…๋ฃŒ



๐Ÿ“Œ ํด๋ž˜์Šค ์„ค๊ณ„

  • ๊ฒŒ์ž„ ์ง€์† ์—ฌ๋ถ€์™€ ๋žœ๋ค ์ˆซ์ž๋ฅผ ๊ฐ€์ง„ ์ƒ์„ฑ์ž
  • ๋žœ๋ค ์ˆซ์ž ์ƒ์„ฑ ๋ฉ”์„œ๋“œ
  • ์ž…๋ ฅ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ
  • ์ŠคํŠธ๋ผ์ดํฌ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ๋ฉ”์„œ๋“œ
  • ๋ณผ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ๋ฉ”์„œ๋“œ
  • play ๋ฉ”์„œ๋“œ

๋žœ๋ค ์ˆซ์ž ์ƒ์„ฑ ๋ฉ”์„œ๋“œ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ

  • @woowacourse/mission-utils์˜ Random API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
  • Random ๊ฐ’ ์ถ”์ถœ์€ Random.pickNumberInRange()๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
  • 1์—์„œ 9๊นŒ์ง€ ์„œ๋กœ ๋‹ค๋ฅธ ์ž„์˜์˜ ์ˆ˜ 3๊ฐœ๋ฅผ ์„ ํƒํ•œ๋‹ค.
  1. Random.pickNumberInRange()๋ฅผ ํ™œ์šฉํ•ด 1~9๊นŒ์ง€ ๋žœ๋ค ์ˆซ์ž๋ฅผ ๋ฝ‘๋Š”๋‹ค.
  2. ์„œ๋กœ ๋‹ค๋ฅธ ์ˆ˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ answer์— ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹ด๋Š”๋‹ค.
  3. ์ด ์‹œํ–‰์„ 3๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ 1์—์„œ 9๊นŒ์ง€ ์„œ๋กœ ๋‹ค๋ฅธ ์ž„์˜์˜ ์ˆ˜ 3๊ฐœ๋ฅผ answer ๋ฐฐ์—ด์— ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
  randomNumberGenerator() {
    const answer = [];
    while (answer.length < 3) {
      const number = MissionUtils.Random.pickNumberInRange(1, 9);
      if (!answer.includes(number)) {
        answer.push(number);
      }
    }
    return answer;
  }

์ž…๋ ฅ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ throw๋ฌธ์„ ์‚ฌ์šฉํ•ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์˜ˆ์™ธ ์ƒํ™ฉ ์‹œ ์—๋Ÿฌ ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ, ์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” โ€œ[ERROR]โ€œ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
  • ex. [ERROR] ์ˆซ์ž๊ฐ€ ์ž˜๋ชป๋œ ํ˜•์‹์ž…๋‹ˆ๋‹ค.
  1. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.
  2. ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Error ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์ž…๋ ฅ๊ฐ’์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ : "[ERROR] ์ˆซ์ž ํ˜•์‹์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค."
    • ์ž…๋ ฅ๊ฐ’์˜ ๊ธธ์ด๊ฐ€ 3์ด ์•„๋‹Œ ๊ฒฝ์šฐ : "[ERROR] ์ˆซ์ž ๊ธธ์ด๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค."
    • ์ž…๋ ฅ๊ฐ’์— 0์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ : "[ERROR] 0์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค."
  3. ์œ ์š”ํ•œ ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โš  ์ด๋•Œ, throw Error๋ฅผ ํ•˜์ง€ ์•Š๊ณ  Console์— ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ๋งŒ ํ•˜๋ฉด test์— ํ†ต๊ณผ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์œ ์˜ํ•œ๋‹ค!

  validateInput(userInput) {
    if (Number.isNaN(Number(userInput))) {
      throw new Error("[ERROR] ์ˆซ์ž ํ˜•์‹์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
    } else if (userInput.length !== 3) {
      throw new Error("[ERROR] ์ˆซ์ž ๊ธธ์ด๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
    } else if (userInput.includes(0)) {
      throw new Error("[ERROR] 0์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.");
    } else {
      return true;
    }
  }

์ŠคํŠธ๋ผ์ดํฌ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ๋ฉ”์„œ๋“œ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ

  • ๊ฐ™์€ ์ˆ˜๊ฐ€ ๊ฐ™์€ ์ž๋ฆฌ์— ์žˆ์œผ๋ฉด ์ŠคํŠธ๋ผ์ดํฌ์ด๋‹ค.
  • ์ŠคํŠธ๋ผ์ดํฌ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์˜ˆ) ์ƒ๋Œ€๋ฐฉ(์ปดํ“จํ„ฐ)์˜ ์ˆ˜๊ฐ€ 425์ผ ๋•Œ, 123์„ ์ œ์‹œํ•œ ๊ฒฝ์šฐ : 1์ŠคํŠธ๋ผ์ดํฌ

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์—์„œ ์ปดํ“จํ„ฐ๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ’๊ณผ ์œ„์น˜์™€ ๊ฐ’์ด ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ filterํ•˜๊ณ  ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  calcStrike(userInput, computerInput) {
    return userInput.filter((el, i) => computerInput[i] === el).length;
  }

๋ณผ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ๋ฉ”์„œ๋“œ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ

  • ๊ฐ™์€ ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ž๋ฆฌ์— ์žˆ์œผ๋ฉด ๋ณผ์ด๋‹ค.
  • ๋ณผ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋ณผ๊ณผ ์ŠคํŠธ๋ผ์ดํฌ๊ฐ€ ๊ฐ™์ด ์žˆ์„ ๊ฒฝ์šฐ ๊ฐ™์ด ์ถœ๋ ฅํ•œ๋‹ค.
  • ์˜ˆ) ์ƒ๋Œ€๋ฐฉ(์ปดํ“จํ„ฐ)์˜ ์ˆ˜๊ฐ€ 425์ผ ๋•Œ, 456์„ ์ œ์‹œํ•œ ๊ฒฝ์šฐ : 1๋ณผ 1์ŠคํŠธ๋ผ์ดํฌ

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์ด ์ปดํ“จํ„ฐ๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ’์— ์กด์žฌํ•˜์ง€๋งŒ ์œ„์น˜๊นŒ์ง€๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ filterํ•˜๊ณ  ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  calcBall(userInput, computerInput) {
    return userInput.filter(
      (el, i) => computerInput.includes(el) && computerInput[i] !== el
    ).length;
  }

play ๋ฉ”์„œ๋“œ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ

  • ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
  • ์ปดํ“จํ„ฐ๋Š” ์ž…๋ ฅํ•œ ์ˆซ์ž์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ์ด ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด ์ปดํ“จํ„ฐ๊ฐ€ ์„ ํƒํ•œ 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋œ๋‹ค.
  • ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•œ ํ›„ ๊ฒŒ์ž„์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›๊ณ  ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Console.readLineAsync, Console.print๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
  1. ์‚ฌ์šฉ์žํ•œํ…Œ ์ˆซ์ž ์ž…๋ ฅ๋ฐ›๊ธฐ
    Console.readLineAsync ํ™œ์šฉ
  2. ์ž…๋ ฅ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ & ์ŠคํŠธ๋ผ์ดํฌ, ๋ณผ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐํ•˜๊ธฐ
    ์œ„์—์„œ ๋งŒ๋“  3๊ฐœ์˜ ๋ฉ”์„œ๋“œ ํ™œ์šฉ
  3. ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋ฌธ๊ตฌ ์ถœ๋ ฅํ•˜๊ธฐ
    Console.print ํ™œ์šฉ
  4. 3์ŠคํŠธ๋ผ์ดํฌ์ธ ๊ฒฝ์šฐ ๊ฒŒ์ž„ ์žฌ์‹œ์ž‘/์ข…๋ฃŒ ์•ˆ๋‚ด
    • ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ : ์ƒˆ๋กœ์šด ๋žœ๋ค ์ˆซ์ž ์ƒ์„ฑ
    • ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ : ๊ฒŒ์ž„ ์ง€์† ์—ฌ๋ถ€๋ฅผ false๋กœ ์„ค์ •
  async play() {
    MissionUtils.Console.print("์ˆซ์ž ์•ผ๊ตฌ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");

    while (this.isContinue) {
      let userInput =
        await MissionUtils.Console.readLineAsync("์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” : ");
      let isValid = this.validateInput(userInput);

      if (isValid) {
        const INPUT_ARR = userInput.toString().split("").map(Number);
        const STRIKE = this.calcStrike(INPUT_ARR, this.computerInput);
        const BALL = this.calcBall(INPUT_ARR, this.computerInput);

        if (STRIKE === 0 && BALL === 0) {
          MissionUtils.Console.print("๋‚ซ์‹ฑ");
        } else if (STRIKE === 3) {
          MissionUtils.Console.print("3์ŠคํŠธ๋ผ์ดํฌ");
          MissionUtils.Console.print(
            "3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ์ข…๋ฃŒ"
          );
          MissionUtils.Console.print(
            "๊ฒŒ์ž„์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด 1, ์ข…๋ฃŒํ•˜๋ ค๋ฉด 2๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”."
          );
          const CHOICE = await MissionUtils.Console.readLineAsync("");
          if (CHOICE === "1") {
            this.computerInput = this.randomNumberGenerator();
          } else if (CHOICE === "2") {
            this.isContinue = false;
          } else {
            throw new Error("[ERROR] ์ž˜๋ชป ์ž…๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.");
          }
        } else if (STRIKE > 0 && BALL > 0) {
          MissionUtils.Console.print(`${BALL}๋ณผ ${STRIKE}์ŠคํŠธ๋ผ์ดํฌ`);
        } else if (STRIKE > 0) {
          MissionUtils.Console.print(`${STRIKE}์ŠคํŠธ๋ผ์ดํฌ`);
        } else if (BALL > 0) {
          MissionUtils.Console.print(`${BALL}๋ณผ`);
        }
      }
    }
  }



๐Ÿ“Œ ์ „์ฒด ์ฝ”๋“œ

https://github.com/Doozuu/javascript-baseball-6/tree/doozuu



โŒ ์ค‘๊ฐ„์— ๋ฐœ์ƒํ–ˆ๋˜ ์˜ค๋ฅ˜

const app = new App();
app.play();
  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ App.js์— ๋„ฃ์—ˆ๋”๋‹ˆ ์•„๋ž˜์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๊ฐ€ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•ด์„œ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค. (ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ ๋”ฐ๋กœ ์ถ”๊ฐ€ํ–ˆ๋”๋‹ˆ ๊ณ„์† ์‹คํ–‰๋˜์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค.)



โ™ป๏ธ ๋ฆฌํŒฉํ† ๋ง

1. ๋ณ€์ˆ˜๋ช… ๋„ค์ด๋ฐ

: ์ƒ์ˆ˜๋ช… ๋Œ€๋ฌธ์ž ๋ณ€๊ฒฝ

before

const answer = [];

after

const ANSWER = [];

2. ๋ฉ”์„œ๋“œ ๋„ค์ด๋ฐ

randomNumberGenerator

๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋“ค(validateInput, calcStrike, calcBall)์€ ๋ชจ๋‘ ๋™์‚ฌ๋กœ ์‹œ์ž‘ํ•˜๋„๋ก ๋„ค์ด๋ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ด๋ฐ ๋ฐฉ์‹์„ ํ†ต์ผํ•œ๋‹ค.
randomNumberGenerator -> generateRandomNum


3. ์ค‘๋ณต ์ฝ”๋“œ ๋‹จ์ถ•

์ค‘๋ณต๋˜๋Š” ์ถœ๋ ฅ ์ฝ”๋“œ๋ฅผ ์ค„๋ฐ”๊ฟˆ \n ์„ ์ด์šฉํ•ด ๋‹จ์ถ•ํ–ˆ๋‹ค.

MissionUtils.Console.print("3์ŠคํŠธ๋ผ์ดํฌ");
MissionUtils.Console.print("3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ์ข…๋ฃŒ");
MissionUtils.Console.print("๊ฒŒ์ž„์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด 1, ์ข…๋ฃŒํ•˜๋ ค๋ฉด 2๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.");
MissionUtils.Console.print("3์ŠคํŠธ๋ผ์ดํฌ\n3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ์ข…๋ฃŒ\n๊ฒŒ์ž„์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด 1, ์ข…๋ฃŒํ•˜๋ ค๋ฉด 2๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.");

๋˜ํ•œ, utils๋ฅผ importํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ฐ”๊พธ์–ด ์ฝ”๋“œ๋ฅผ ๋‹จ์ถ•์‹œ์ผฐ๋‹ค.

Before ) MissionUtils๋ฅผ importํ•  ๋•Œ

MissionUtils.Console.print
MissionUtils.Random.pickNumberInRange

import { MissionUtils } from "@woowacourse/mission-utils";
MissionUtils.Console.print("3์ŠคํŠธ๋ผ์ดํฌ\n3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ์ข…๋ฃŒ\n๊ฒŒ์ž„์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด 1, ์ข…๋ฃŒํ•˜๋ ค๋ฉด 2๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.");

After ) Random, Console๋ฅผ importํ•  ๋•Œ

Console.print
Random.pickNumberInRange

import { Random, Console } from "@woowacourse/mission-utils";
Console.print("3์ŠคํŠธ๋ผ์ดํฌ\n3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ์ข…๋ฃŒ\n๊ฒŒ์ž„์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด 1, ์ข…๋ฃŒํ•˜๋ ค๋ฉด 2๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.");

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด MissionUtils ๋ถ€๋ถ„์„ ์ƒ๋žตํ•˜๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค.(์ฝ”๋“œ ๋‹จ์ถ•)


4. ํด๋ฆฐ์ฝ”๋“œ ๊ทœ์น™ ์—„์ˆ˜ํ•˜๊ธฐ

๋ฉ”์„œ๋“œ ๊ธธ์ด๊ฐ€ 10์„ ๋„˜์–ด๊ฐ€๋ฉด ๋ถ„๋ฆฌํ•˜๊ธฐ

play ๋ฉ”์„œ๋“œ์˜ ๊ธธ์ด๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ์ด๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

async play() {
    Console.print("์ˆซ์ž ์•ผ๊ตฌ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");

    while (this.isContinue) {
      const USERINPUT = await Console.readLineAsync("์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” : ");
      const IS_VALID = this.validateInput(USERINPUT);

      if (IS_VALID) {
        const INPUT_ARR = USERINPUT.toString().split("").map(Number);
        const STRIKE = this.calcStrike(INPUT_ARR, this.computerInput);
        const BALL = this.calcBall(INPUT_ARR, this.computerInput);

        if (STRIKE === 3) {
          Console.print(
            "3์ŠคํŠธ๋ผ์ดํฌ\n3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ์ข…๋ฃŒ\n๊ฒŒ์ž„์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด 1, ์ข…๋ฃŒํ•˜๋ ค๋ฉด 2๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”."
          );
          const CHOICE = await Console.readLineAsync("");
          if (CHOICE === "1") {
            this.computerInput = this.generateRandomNum();
          } else if (CHOICE === "2") {
            this.isContinue = false;
          } else {
            throw new Error("[ERROR] ์ž˜๋ชป ์ž…๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.");
          }
        } else if (STRIKE === 0 && BALL === 0) {
          Console.print("๋‚ซ์‹ฑ");
        } else if (STRIKE > 0 && BALL > 0) {
          Console.print(`${BALL}๋ณผ ${STRIKE}์ŠคํŠธ๋ผ์ดํฌ`);
        } else if (STRIKE > 0) {
          Console.print(`${STRIKE}์ŠคํŠธ๋ผ์ดํฌ`);
        } else if (BALL > 0) {
          Console.print(`${BALL}๋ณผ`);
        }
      }
    }
  }

๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” printResult ๋ฉ”์„œ๋“œ์™€ ๊ฒŒ์ž„ ์žฌ์‹œ์ž‘/์ข…๋ฃŒ๋ฅผ ์„ ํƒํ•˜๋Š” selectOption ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

  async selectOption() {
    Console.print(
      "3์ŠคํŠธ๋ผ์ดํฌ\n3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ์ข…๋ฃŒ\n๊ฒŒ์ž„์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด 1, ์ข…๋ฃŒํ•˜๋ ค๋ฉด 2๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”."
    );
    const CHOICE = await Console.readLineAsync("");
    if (CHOICE === "1") {
      this.computerInput = this.generateRandomNum();
    } else if (CHOICE === "2") {
      this.isContinue = false;
    } else {
      throw new Error("[ERROR] ์ž˜๋ชป ์ž…๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.");
    }
  }

  async printResult(strike, ball) {
    if (strike === 3) {
      await this.selectOption();
    } else if (strike === 0 && ball === 0) {
      Console.print("๋‚ซ์‹ฑ");
    } else if (strike > 0 && ball > 0) {
      Console.print(`${ball}๋ณผ ${strike}์ŠคํŠธ๋ผ์ดํฌ`);
    } else if (strike > 0) {
      Console.print(`${strike}์ŠคํŠธ๋ผ์ดํฌ`);
    } else if (ball > 0) {
      Console.print(`${ball}๋ณผ`);
    }
  }

  async play() {
    Console.print("์ˆซ์ž ์•ผ๊ตฌ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");

    while (this.isContinue) {
      const USERINPUT = await Console.readLineAsync("์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” : ");
      const IS_VALID = this.validateInput(USERINPUT);

      if (IS_VALID) {
        const INPUT_ARR = USERINPUT.toString().split("").map(Number);
        const STRIKE = this.calcStrike(INPUT_ARR, this.computerInput);
        const BALL = this.calcBall(INPUT_ARR, this.computerInput);
        await this.printResult(STRIKE, BALL);
      }
    }
  }

ํด๋ฆฐ์ฝ”๋“œ ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ
Airbnb ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ



๐Ÿ‘€ ๋А๋‚€ ์ 

  • ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ๋ณ„๋กœ ์—†๋Š”๋ฐ ์ด๋ฒˆ ๊ธฐํšŒ์— ํ™œ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ƒ‰๋‹ค๋ฅด๊ณ  ์ข‹์•˜๋‹ค.
  • ์š”๊ตฌ์‚ฌํ•ญ์ด ๊ฐ„๋‹จํ•œ๋“ฏ ํ•˜๋ฉด์„œ๋„ ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•ด์„œ ๊ผผ๊ผผํ•˜๊ฒŒ ์ฝ์–ด์•ผ ํ–ˆ๋‹ค.
  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ์— ์กฐ๊ธˆ ๋” ์‹œ๊ฐ„์„ ๋“ค์ด๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๋‹ค.
  • ๋„ค์ด๋ฐ ๊ทœ์น™์„ ์ข€ ๋” ์‹ ๊ฒฝ์จ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜์—ˆ๋‹ค.
  • ํ‰์†Œ const๋ฅผ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  let์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ const๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค.
  • ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ปค๋ฐ‹ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๊ณ , ํ‰์†Œ์—๋„ ๊ธฐ๋Šฅ ๋‹จ์œ„๋ณ„๋กœ ์ปค๋ฐ‹ํ•˜๊ธฐ ์œ„ํ•ด ์ข€ ๋” ์‹ ๊ฒฝ์จ์•ผ๊ฒ ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.
  • ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๊ณ , ํด๋ฆฐ์ฝ”๋“œ์™€ ๊ด€๋ จํ•ด์„œ ๊ณต๋ถ€๋ฅผ ๋” ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.



โœŒ๏ธ 1์ฃผ์ฐจ ๊ณผ์ œ ์™„๋ฃŒ!



๐Ÿ“ ์ฐธ๊ณ ์ž๋ฃŒ

๊ณผ์ œ ์ œ์ถœ ๋ฐฉ๋ฒ• ์•ˆ๋‚ด
ํ”„๋ฆฌ์ฝ”์Šค ์˜คํ‹ฐ ์ •๋ฆฌ ๋ธ”๋กœ๊ทธ
ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์œ„ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ
๋ณ€์ˆ˜๋ช… ์‰ฝ๊ฒŒ ์ง“๋Š” ์‚ฌ์ดํŠธ
๋ชฐ์ž…์‹œ๊ฐ„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ
ํด๋ฆฐ์ฝ”๋“œ ์ž‘์„ฑํŒ

profile
๋ชจ๋“ ๊ฒŒ ์ƒˆ๋กญ๊ณ  ์žฌ๋ฐŒ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์ƒˆ์‹น

0๊ฐœ์˜ ๋Œ“๊ธ€