πŸƒβ€β™€οΈν”„λ¦¬μ½”μŠ€ λ‹€μ‹œ ν’€κΈ° - 숫자 야ꡬ

κΉ€μ˜μš°Β·2022λ…„ 11μ›” 28일
0
post-thumbnail

🎯 λͺ©ν‘œ

ν”„λ¦¬μ½”μŠ€ 4μ£Όμ°¨κΉŒμ§€μ˜ ν”Όλ“œλ°± 사항 λͺ¨λ‘ λ°˜μ˜ν•˜κΈ°


πŸ“ κΈ°λŠ₯ λͺ©λ‘ μž‘μ„±

처음 숫자 야ꡬ λ―Έμ…˜μ„ μˆ˜ν–‰ν•  λ•ŒλŠ” κΈ°λŠ₯ λͺ©λ‘ μž‘μ„±μ— 정말 λ§Žμ€ λ…Έλ ₯을 λ“€μ˜€μ—ˆλ‹€. κΈ°λŠ₯ λͺ©λ‘ 뿐만 μ•„λ‹ˆλΌ ꡬ체적인 κ΅¬ν˜„ λ°©ν–₯성도 μ„€μ •ν•˜λŠ” λ“± μΆ”ν›„ μˆ˜μ • κ°€λŠ₯ν•  λ‚΄μš© λ§ˆμ €λ„ λͺ¨λ‘ μž‘μ„±ν–ˆμ—ˆλ‹€.

λ³€κ²½ κ°€λŠ₯ν•œ λ‚΄μš©μ„ μ λŠ” 것을 μ΅œλŒ€ν•œ 쀄이고 μˆœμˆ˜ν•˜κ²Œ κΈ°λŠ₯ λͺ©λ‘κ³Ό μ˜ˆμ™Έ μ‚¬ν•­λ§Œμ„ 적도둝 λ…Έλ ₯ν–ˆλ‹€.

κΈ°λŠ₯ λͺ©λ‘μœΌλ‘œ 처음 μž‘μ„±ν–ˆλ˜ λ‚΄μš©μ΄λ‹€. 숫자 야ꡬ ν”„λ‘œκ·Έλž¨μ˜ 흐름을 보고 κ°€μž₯ ν•„μš”ν•  것 같은 λͺ©λ‘μ„ μž‘μ„±ν–ˆλ‹€. ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ˜ 쀑 κ³„μ†ν•΄μ„œ 좔가적인 κΈ°λŠ₯듀이 ν•„μš”ν•¨μ„ 느꼈고, μ—¬λŸ¬λ²ˆμ˜ λͺ©λ‘ μΆ”κ°€λ₯Ό 거쳐 λ‹€μŒκ³Ό 같은 κΈ°λŠ₯ λͺ©λ‘μœΌλ‘œ λ³€ν™”ν•˜κ²Œ λ˜μ—ˆλ‹€.


🧩 MVC νŒ¨ν„΄ 적용

4μ£Όμ°¨ λ―Έμ…˜μ„ μˆ˜ν–‰ν•  λ•Œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 UI λ‘œμ§μ„ λΆ„λ¦¬ν•˜κ³ , 객체λ₯Ό κ°μ²΄λ‹΅κ²Œ μ‚¬μš©ν•΄λ³΄κΈ° μœ„ν•΄ MVC νŒ¨ν„΄μ„ μ μš©ν–ˆμ—ˆλ‹€. λͺ¨λΈμ„ 톡해 값을 κ΄€λ¦¬ν•˜κ³ , λ·°λ₯Ό 톡해 UIλ₯Ό κ΅¬μ„±ν–ˆλ‹€.

πŸ“Š λͺ¨λΈ

λ¨Όμ € 숫자 야ꡬ에 μ‚¬μš©λ˜λŠ” 값듀을 μ •λ¦¬ν•΄λ³΄μ•˜λ‹€.

  • 컴퓨터가 μƒμ„±ν•˜λŠ” 랜덀 숫자 (μ •λ‹΅ κ°’)
  • μœ μ €κ°€ μž…λ ₯ν•˜λŠ” 숫자
  • λ³Ό, 슀트라이크 개수
  • 힌트 문ꡬ
    - ex) "1슀트라이크", "2볼", "1볼 2슀트라이크"
  • μœ μ €κ°€ μž…λ ₯ν•˜λŠ” μž¬μ‹œμž‘ μ—¬λΆ€

❗컴퓨터가 μƒμ„±ν•˜λŠ” 랜덀 숫자 (μ •λ‹΅ κ°’)

μœ μ €κ°€ 정닡을 λ§žμΆ”κΈ° μ „κΉŒμ§€ κ·Έ 값은 λ³€κ²½λ˜μ§€ μ•Šκ³  κΈ°μ–΅ λ˜μ–΄μ•Ό ν•œλ‹€. 또, μœ μ €κ°€ 정닡을 λ§žμ·„μ„ λ•Œ μž¬μ‹œμž‘μ„ μ›ν•œλ‹€λ©΄ μƒˆλ‘œμš΄ κ°’μœΌλ‘œ λ³€κ²½λ˜μ–΄μ•Ό ν•œλ‹€. 이 값을 λ”°λ‘œ μ €μž₯ν•˜μ§€ μ•Šκ³  ν•„μš”ν•  λ•Œλ§ˆλ‹€ μƒμ„±ν•΄μ„œ μ‚¬μš©ν•œλ‹€λ©΄ 둜직이 λ³΅μž‘ν•΄μ§ˆ 것 κ°™μ•„ λͺ¨λΈμ—μ„œ κ΄€λ¦¬ν•˜λ„λ‘ ν–ˆλ‹€.


β—μœ μ €κ°€ μž…λ ₯ν•˜λŠ” 숫자

μœ μ €κ°€ 정닡을 λ§žμΆ”κΈ° μ „κΉŒμ§€ μœ μ €κ°€ μž…λ ₯ν•˜λŠ” μˆ«μžλŠ” κ³„μ†ν•΄μ„œ 변경될 것이닀. λ”°λΌμ„œ 이 값을 μ €μž₯ν•˜μ—¬ ν•„μš”ν•œ 값듀을 κ³„μ‚°ν•˜κΈ°λ³΄λ‹€ μž…λ ₯이 λ°œμƒν•  λ•Œλ§ˆλ‹€ κ·Έ 값을 톡해 ν•„μš”ν•œ 값듀을 κ³„μ‚°ν•˜λ„λ‘ ν–ˆλ‹€.


❗볼, 슀트라이크 개수

이 λ˜ν•œ μœ μ €μ˜ μž…λ ₯값이 변경됨에 따라 κ³„μ†ν•΄μ„œ λ³€κ²½λ˜λŠ” 값이닀. λ”°λΌμ„œ 이 값도 μ €μž₯ν•˜μ§€ μ•Šκ³  μœ μ €μ˜ μž…λ ₯이 λ°œμƒν•  λ•Œλ§ˆλ‹€ κ³„μ‚°ν•˜λ„λ‘ ν–ˆλ‹€.


β—νžŒνŠΈ 문ꡬ

힌트 문ꡬ λ˜ν•œ μ•žμ„  λ³Ό, 슀트라이크 κ°œμˆ˜μ™€ 같은 이유둜 μœ μ €μ˜ μž…λ ₯이 λ°œμƒν•  λ•Œλ§ˆλ‹€ κ³„μ‚°ν•˜λ„λ‘ ν–ˆλ‹€.


β—μœ μ €κ°€ μž…λ ₯ν•˜λŠ” μž¬μ‹œμž‘ μ—¬λΆ€

μœ μ €μ˜ μž¬μ‹œμž‘ μ—¬λΆ€λŠ” κ²Œμž„μ΄ μ’…λ£Œλ˜μ—ˆμ„ μ‹œμ μ— 단 ν•œλ²ˆλ§Œ μ‚¬μš©λ˜λŠ” 값이닀. λ”°λΌμ„œ 이λ₯Ό μ €μž₯ν•˜μ§€ μ•Šκ³ , μž…λ ₯이 λ°œμƒν–ˆμ„ λ•Œ μž¬μ‹œμž‘μ„ νŒλ‹¨ν•˜λŠ” κ²Œμž„ 둜직이 μ‹€ν–‰λ˜λ„λ‘ ν–ˆλ‹€.

μ΅œμ’…μ μœΌλ‘œ λͺ¨λΈμ— μ €μž₯ν•  값은 컴퓨터가 μƒμ„±ν•˜λŠ” 랜덀 숫자 ν•˜λ‚˜λ‘œ κ²°μ •ν–ˆλ‹€.


πŸ–₯️ λ·°

λ¨Όμ € 주어진 숫자 μ•Όκ΅¬μ˜ μ˜ˆμ‹œλ₯Ό 보자.

숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.
숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : 123
1볼 1슀트라이크
숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : 145
1λ³Ό
숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : 671
2λ³Ό
숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : 216
1슀트라이크
숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : 713
3슀트라이크
3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ
κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.
1
숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : 123
1λ³Ό
...

μ˜ˆμ‹œλ₯Ό 톡해 ν•„μš”ν•œ UI λ‘œμ§μ„ μ •λ¦¬ν•΄λ³΄μ•˜λ‹€.

  • μœ μ € 숫자 μž…λ ₯ κΈ°λŠ₯
  • μž¬μ‹œμž‘ μ—¬λΆ€ μž…λ ₯ κΈ°λŠ₯
  • 힌트 좜λ ₯ κΈ°λŠ₯
  • μ‹œμž‘, μ’…λ£Œ 문ꡬ 좜λ ₯ κΈ°λŠ₯

⌨️ μž…λ ₯ κΈ°λŠ₯

μž…λ ₯ κΈ°λŠ₯ 두 κ°€μ§€λŠ” 콜백 ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ InputView κ°μ²΄μ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ ν–ˆλ‹€.

function readUserNumber(callback) {
  Console.readLine(GuideString.INPUT_NUMBER, (input) => {
    InputView.validateUserNumber(input);
    callback(input);
  });
},

function readRestartCommand(callback) {
  Console.readLine(GuideString.RESTART, (input) => {
    InputView.validateRestartCommand(input);
    callback(input);
  });
}

πŸ–¨οΈ 좜λ ₯ κΈ°λŠ₯

좜λ ₯κΈ°λŠ₯ 쀑 힌트λ₯Ό 좜λ ₯ν•˜λŠ” κΈ°λŠ₯은 λ‹€μŒκ³Ό 같은 경우의 μˆ˜κ°€ μ‘΄μž¬ν•œλ‹€.

  1. 볼만 μžˆλŠ” 경우
  2. 슀트라이크만 μžˆλŠ” 경우
  3. λ³Ό, 슀트라이크 λͺ¨λ‘ μžˆλŠ” 경우
  4. λ³Ό, 슀트라이크 λͺ¨λ‘ μ—†λŠ” 경우

Outputκ°μ²΄μ—μ„œ λ³Ό, 슀트라이크 개수λ₯Ό 인자둜 λ°›μ•„ μœ„ 4가지 κ²½μš°μ— 따라 힌트λ₯Ό 좜λ ₯ν•˜λŠ” ν•¨μˆ˜λ₯Ό μΆ”κ°€ν–ˆλ‹€.

4가지 경우 쀑 3번의 κ²½μš°μ—” λ³Ό, 슀트라이크 힌트 사이에 곡백을 μΆ”κ°€ν•˜μ—¬ 좜λ ₯ν•΄μ•Ό ν•˜λ―€λ‘œ λ‹€λ₯Έ 3가지 κ²½μš°μ™€ 좜λ ₯ 방식이 λ‹¬λΌμ§€κ²Œ λœλ‹€.

이λ₯Ό join λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ λ‹€μŒκ³Ό 같이 ν•΄κ²°ν–ˆλ‹€.

printHintString(strikeCount, ballCount) {
    const hint = [];
    if (ballCount !== 0) hint.push(`${ballCount}λ³Ό`);
    if (strikeCount !== 0) hint.push(`${strikeCount}슀트라이크`);
    if (ballCount === 0 && strikeCount === 0) hint.push(`λ‚«μ‹±`);

    Console.print(hint.join(" "));
  },

πŸŽ›οΈ 컨트둀러

λͺ¨λΈμ€ μ •λ‹΅ κ°’ ν•„λ“œ, λ³Ό κ°œμˆ˜μ™€ 슀트라이크 개수λ₯Ό 각각 λ°˜ν™˜ν•΄μ£ΌλŠ” λ©”μ„œλ“œ, μ •λ‹΅ 값을 κ΅μ²΄ν•˜λŠ” λ©”μ„œλ“œλ₯Ό 가지고 μžˆλ‹€. μ»¨νŠΈλ‘€λŸ¬μ—μ„œλŠ” 이λ₯Ό μ΄μš©ν•΄ λ‹€μŒμ˜ λ‘œμ§μ„ μˆ˜ν–‰ν•œλ‹€.

  • μ •λ‹΅ κ°’ 생성
  • μœ μ € μž…λ ₯에 λ”°λ₯Έ 힌트 좜λ ₯
    1. 뷰의 μœ μ € μž…λ ₯ λ©”μ„œλ“œ 호좜
    1. λͺ¨λΈμ˜ λ³Ό 슀트라이크 개수 μ‚°μΆœ λ©”μ„œλ“œ 호좜
    2. 뷰의 힌트 좜λ ₯ λ©”μ„œλ“œ 호좜
  • 슀트라이크 κ°œμˆ˜μ— 따라 λ©”μ„œλ“œ 호좜
    1. 3슀트라이크 => 뷰의 μž¬μ‹œμž‘ μ—¬λΆ€ μž…λ ₯ λ©”μ„œλ“œ 호좜
    1. !3슀트라이크 => 뷰의 μœ μ € μž…λ ₯ λ©”μ„œλ“œ 호좜
  • μž¬μ‹œμž‘ 여뢀에 따라 λ©”μ„œλ“œ 호좜
    1. 1 μž…λ ₯ (μž¬μ‹œμž‘) => λͺ¨λΈμ˜ μ •λ‹΅ ꡐ체 λ©”μ„œλ“œ 호좜, 뷰의 μœ μ € μž…λ ₯ λ©”μ„œλ“œ 호좜
    1. 2 μž…λ ₯ (μ’…λ£Œ) => Console λͺ¨λ“ˆμ˜ close λ©”μ„œλ“œ 호좜

μœ„μ—μ„œ λ³΄λŠ” 것과 같이 μ»¨νŠΈλ‘€λŸ¬λŠ” λͺ¨λΈκ³Ό 뷰의 λ©”μ„œλ“œλ₯Ό λ‘œμ§μ— 맞게 ν˜ΈμΆœν•˜μ—¬ κ²Œμž„μ„ μ§„ν–‰ν•˜λŠ” 역할을 μˆ˜ν–‰ν•˜λ„λ‘ μž‘μ„±ν–ˆλ‹€.


πŸ€™ μƒμˆ˜ μ‚¬μš©

ν”Όλ“œλ°± 사항에 ν¬ν•¨λ˜μ–΄ μžˆμ—ˆμ§€λ§Œ μ΅œκ·ΌκΉŒμ§€ λ‚˜λŠ” μƒμˆ˜ μ‚¬μš©μ˜ 이유λ₯Ό λͺ…ν™•νžˆ μ„€λͺ…ν•  수 μ—†μ—ˆλ‹€. κ·ΈλŸ¬λ‹€ μš°ν…Œμ½” 크루듀이 ν•™μŠ΅ν•œ λ‚΄μš©μ„ 정리, κ³΅μœ ν•˜λŠ” Tecoble의 ν•˜λ“œ 코딩을 피해라을 읽고 κ·Έ 해닡을 얻을 수 μžˆμ—ˆλ‹€.

κ°„λ‹¨νžˆ λ§ν•˜μžλ©΄ μƒμˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή 수치의 의미λ₯Ό μ‰½κ²Œ νŒŒμ•…ν•  수 있고, 변경에 μœ μ—°ν•˜κ²Œ λŒ€μ²˜ν•  수 있게 λœλ‹€. λ”°λΌμ„œ μ΄λ²ˆμ— μˆ«μžμ•Όκ΅¬μ—μ„œ 이λ₯Ό μ μš©ν•΄λ³΄κ³ μž ν–ˆλ‹€.


🧐 숫자 μ•Όκ΅¬μ—μ„œ 변경될 수 μžˆλŠ” κ°’?

ν”„λ¦¬μ½”μŠ€ λ―Έμ…˜μ—μ„œ 숫자 μ•Όκ΅¬λŠ” 3개의 숫자λ₯Ό λ§žμΆ”λŠ” κ²Œμž„μ΄μ—ˆλ‹€. μ΄λ•Œ 이 3개의 숫자λ₯Ό κ²°μ •ν•˜λŠ” 3μ΄λž€ 숫자λ₯Ό λ³€κ²½ν•˜λ©΄ 3개 μ΄μƒμ˜ μ—¬λŸ¬κ°€μ§€ 숫자λ₯Ό λ§žμΆ”λŠ” 숫자 μ•Όκ΅¬λ‘œ κ²Œμž„μ΄ λ°”λ€” 수 μžˆλ‹€.


πŸ”§ 적용

이λ₯Ό μ μš©ν•΄λ³΄κ³ μž /constants/Constant.js에 numberSizeλΌλŠ” μƒμˆ˜λ₯Ό 선언해두고, 이λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.

// 랜덀 κ°’ 생성 ν•¨μˆ˜
function generateRandomNumber(size) {
  const randomNumbers = [];

  while (randomNumbers.length < size) {
    const newRandomNumber = Random.pickNumberInRange(1, 9);
    if (!randomNumbers.includes(newRandomNumber))
      randomNumbers.push(newRandomNumber);
  }

  return randomNumbers;
}

// 랜덀 κ°’ 생성 ν•¨μˆ˜ μ‚¬μš©
generateRandomNumber(numberSize);

μœ„ ν•¨μˆ˜λŠ” 랜덀 숫자λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. sizeλ₯Ό μž…λ ₯ λ°›μ•„ κ·Έ 개수 만큼의 λžœλ€ν•œ 숫자λ₯Ό μƒμ„±ν•΄μ£ΌλŠ” 역할을 μˆ˜ν–‰ν•œλ‹€. 이λ₯Ό ν˜ΈμΆœν•  λ•Œ numberSizeλ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν–ˆλ‹€.


// μƒμˆ˜ 변경에 따라 좜λ ₯ 문ꡬ λ³€κ²½
const numberSize = 3;

const GuideString = Object.freeze({
  START: "숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.",
  INPUT_NUMBER: "숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : ",
  RESTART: "κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.\n",
  END: `${numberSize}개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ`,
});

const ErrorString = Object.freeze({
  USER_NUMBER_LENGTH_ERROR: `μž…λ ₯κ°’μ˜ κ°œμˆ˜κ°€ μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ${numberSize}개의 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.`,
  USER_NUMBER_NOT_NUMBER_ERROR: `μž…λ ₯값에 μˆ«μžκ°€ μ•„λ‹Œ λ‹€λ₯Έ 값이 ν¬ν•¨λΌμžˆμŠ΅λ‹ˆλ‹€. 숫자만 μž…λ ₯ν•΄μ£Όμ„Έμš”.`,
  USER_NUMBER_DUPLICATE_ERROR: `μž…λ ₯값에 쀑볡이 ν¬ν•¨λΌμžˆμŠ΅λ‹ˆλ‹€. μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.`,
  RESTART_COMMAND_NOT_COMMAND_ERROR: `μž…λ ₯값에 1, 2κ°€ μ•„λ‹Œ λ‹€λ₯Έ 값이 ν¬ν•¨λΌμžˆμŠ΅λ‹ˆλ‹€. 1κ³Ό 2쀑 ν•˜λ‚˜λ₯Ό 선택해 μž…λ ₯ν•΄μ£Όμ„Έμš”.`,
  RESTART_COMMAND_LENGTH_ERROR: `μž…λ ₯κ°’μ˜ κ°œμˆ˜κ°€ μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 1κ³Ό 2쀑 ν•˜λ‚˜λ₯Ό 선택해 μž…λ ₯ν•΄μ£Όμ„Έμš”.`,
});

μœ„ 객체듀은 좜λ ₯ 문ꡬλ₯Ό λͺ¨μ•„놓은 객체이닀. numberSize에 따라 μ •λ‹΅ κ°’μ˜ κ°œμˆ˜κ°€ λ‹¬λΌμ§€λ―€λ‘œ 그에 λ”°λ₯Έ 좜λ ₯ 문ꡬλ₯Ό μ €μž₯ν•˜κ²Œ λœλ‹€.


if (input.length !== numberSize)
  throw new Error(ErrorString.USER_NUMBER_LENGTH_ERROR);

μœ„ ν•¨μˆ˜λŠ” μ‚¬μš©μžμ˜ μž…λ ₯κ°’μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λŠ” ν•¨μˆ˜μ˜ 쑰건 일뢀이닀. 이 ν•¨μˆ˜λŠ” μž…λ ₯값이 numberSize와 같지 μ•Šλ‹€λ©΄ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.


function handleInputOrEnd(strikeCount, ballCount) {
  printHintString(strikeCount, ballCount);

  if (strikeCount === numberSize) {
    printEndString();
    return this.inputRestartCommand();
  }
  return this.inputUserNumber();
}

μœ„ ν•¨μˆ˜λŠ” 컨트둀러의 κ²Œμž„ 진행을 κ²°μ •ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€. 이 λ©”μ„œλ“œλŠ” 슀트라이크 κ°œμˆ˜κ°€ numberSize와 같아지면 뷰의 μž¬μ‹œμž‘ μ—¬λΆ€ μž…λ ₯ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.


β—μƒμˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” μ’€ 더 ν•™μŠ΅ν•œ 뒀에 λ‚˜λ§Œμ˜ μ–Έμ–΄λ‘œ μžμ„Ένžˆ 정리해 λ³Ό κ³„νšμ΄λ‹€.

πŸ‘‹ 마무리

숫자 μ•Όκ΅¬λŠ” μ§€λ‚œ ν”„λ¦¬μ½”μŠ€ 2주차에 이미 μ™„μ„±ν–ˆλ˜ λ―Έμ…˜μ΄μ–΄μ„œ μ†”μ§νžˆ λ‹€μ‹œ μ‹œμž‘ν•  λ•Œ 이게 μ–Όλ§ˆλ‚˜ 도움이 될까 μ˜μ‹¬μ„ ν–ˆμ—ˆλ‹€. ν•˜μ§€λ§Œ μ§€λ‚œ ν”Όλ“œλ°±μ„ λͺ¨λ‘ λ°˜μ˜ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©° 이전에 μˆ˜ν–‰ν–ˆλ˜ 것듀이 μ§„μ§œ λ‚΄ 것이 λ˜λŠ” 과정을 κ²½ν—˜ν–ˆλ‹€. 또 ν˜Ήμ‹œ λͺ¨λ₯Ό μ΅œμ’… ν…ŒμŠ€νŠΈλ₯Ό λŒ€λΉ„ν•˜μ—¬ μˆ˜ν–‰ν•΄λ³Έ 만큼 μ΅œμ’… ν…ŒμŠ€νŠΈμ— κ°€κ²Œ λœλ‹€λ©΄ 이번 κ²½ν—˜μ„ 톡해 쑰금 더 μžμ‹ μžˆκ²Œ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•  수 μžˆμ„ 것 κ°™λ‹€.

전체 μ½”λ“œλŠ” λ‹€μŒ 링크λ₯Ό 톡해 확인해볼 수 μžˆλ‹€.

profile
λΆˆνŽΈν•œ 일듀을 개발둜 ν’€μ–΄λ‚΄κ³  싢은 ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžμž…λ‹ˆλ‹€!

0개의 λŒ“κΈ€