ν—ˆκΉ…νŽ˜μ΄μŠ€, λ§€κ°œλ³€μˆ˜ 135M에 λΆˆκ³Όν•œ β€˜μŠ€λͺ°LM’ μΆœμ‹œ (링크)

기사 λ‚΄μš© μš”μ•½
 λ²€μ²˜λΉ„νŠΈλŠ” 16일(ν˜„μ§€μ‹œκ°„) ν—ˆκΉ…νŽ˜μ΄μŠ€κ°€ ν΄λΌμš°λ“œ μ„œλ²„μ— μ—°κ²°ν•˜μ§€ μ•Šκ³ λ„ μž₯μΉ˜μ—μ„œ 둜컬둜 μ‹€ν–‰ κ°€λŠ₯ν•œ μ˜¨λ””λ°”μ΄μŠ€ 인곡지λŠ₯(AI)용 μ˜€ν”ˆ μ†ŒμŠ€ sLM β€˜μŠ€λͺ°LM(SmolLM)’을 κ³΅κ°œν–ˆλ‹€κ³  λ³΄λ„ν–ˆλ‹€.
 μ΄μ— λ”°λ₯΄λ©΄ 슀λͺ°LM은 ν…μŠ€νŠΈ 생성 μž‘μ—…μ„ 효율적으둜 μˆ˜ν–‰ν•˜λ„λ‘ μ„€κ³„λœ μ†Œν˜• λͺ¨λΈλ‘œ, 3가지 버전을 μΆœμ‹œν–ˆλ‹€. λ§€κ°œλ³€μˆ˜λŠ” 각각 1μ–΅3500만개(135M), 3μ–΅6000만개(360M), 17μ–΅κ°œ(1.7B)둜 ν˜„μž¬ 곡개된 sLM 쀑 κ°€μž₯ μž‘μ€ 규λͺ¨λ‹€.
 ν—ˆκΉ… νŽ˜μ΄μŠ€λŠ” 데이터 νλ ˆμ΄μ…˜λΆ€ν„° ν›ˆλ ¨ 단계에 이λ₯΄κΈ°κΉŒμ§€ 전체 개발 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ˜€ν”ˆ μ†ŒμŠ€λ‘œ λ§Œλ“€μ–΄ μ°¨λ³„ν™”ν–ˆλ‹€κ³  λ°ν˜”λ‹€. μ„±λŠ₯ λ©΄μ—μ„œλ„ 큰 λͺ¨λΈμ— 뒀지지 μ•ŠλŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬λ‹€. 

 

핡심 μš©μ–΄
  • sLM(small Language Model)μ΄λž€?
    • μ†Œν˜•μ–Έμ–΄λͺ¨λΈλ‘œ λŒ€κ·œλͺ¨μ–Έμ–΄λͺ¨λΈμ— λΉ„ν•΄ 크기가 μž‘μ€ μ–Έμ–΄ λͺ¨λΈμ„ 의미
    • λ§€κ°œλ³€μˆ˜κ°€ 1,000μ–΅ 개 미만
  • sLM의 μž₯점
    • λΉ„μš© νš¨μœ¨μ„± : μ €λ ΄ν•˜κ³  적은 μ»΄ν“¨νŒ… μžμ›μ΄ ν•„μš”
    • νŠΉμ • λ„λ©”μΈμ΄λ‚˜ μž‘μ—…μ— 맞게 λ―Έμ„Έμ‘°μ •(fine-tuning)ν•˜κΈ° 용이
    • λͺ¨λ°”일 κΈ°κΈ°λ‚˜ 엣지 λ””λ°”μ΄μŠ€μ— λ°°ν¬ν•˜κΈ°μ— 적합
    • 데이터 λ³΄μ•ˆκ³Ό ν”„λΌμ΄λ²„μŠ€ 보호 μΈ‘λ©΄ : 쑰직 λ‚΄λΆ€ λ°μ΄ν„°λ§Œμ„ μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅ν•˜λ―€λ‘œ 정보 유좜 μ΅œμ†Œν™”

 

β€» Reference β€»

https://www.woongjin.co.kr/customer/blogView.do?no=16&category2=10&keyword= (λ§€κ°œλ³€μˆ˜μ— λ”°λ₯Έ λͺ¨λΈ ꡬ뢄)

https://blog.kakaocloud.com/80 (sLM의 μž₯점 및 ν™œμš©λΆ„μ•Ό)

https://www.aitimes.com/news/articleView.html?idxno=161648 (SmollLM κ΄€λ ¨ 기사)


관심이 뜨거운 뢄야이기 λ•Œλ¬Έμ— λͺ¨λΈκ³Ό νŠΈλ Œλ“œκ°€ λΉ λ₯΄κ²Œ λ³€ν™”ν•˜κ³  μžˆλŠ” 것 κ°™λ‹€. λ‹€μ–‘ν•œ λΆ„μ•Όμ˜ κΈ°μ—…μ—μ„œ μƒˆλ‘œμš΄ λͺ¨λΈκ³Ό κΈ°μˆ λ“€μ΄ μΆœμ‹œλ˜κ³  μžˆλŠ”λ° μ–΄λ–€ 것듀이 μΆœμ‹œλ˜μ—ˆκ³  μ–΄λ–€ κΈ°λŠ₯이 μžˆλŠ”μ§€λ₯Ό μ°Ύμ•„λ³΄λ©΄μ„œ νŠΈλ Œλ“œλ₯Ό 따라가야겠닀.

μ•„λ§ˆμ‘΄, λͺ‡λΆ„ λ§Œμ— ν”„λ‘¬ν”„νŠΈλ‘œ κΈ°μ—…μš© μ•± μƒμ„±ν•˜λŠ” β€˜μ•± μŠ€νŠœλ””μ˜€β€™ κ³΅κ°œ (링크)

기사 λ‚΄μš© μš”μ•½
 λ²€μ²˜λΉ„νŠΈλŠ” 10일(ν˜„μ§€μ‹œκ°„) AWSκ°€ μ—°λ‘€ λ‰΄μš• μ„œλ°‹ ν–‰μ‚¬μ—μ„œ ν”„λ‘¬ν”„νŠΈλ‘œ κΈ°μ—…μš© μ†Œν”„νŠΈμ›¨μ–΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” AI 도ꡬ인 β€˜μ•± μŠ€νŠœλ””μ˜€(App Studio)’λ₯Ό 프리뷰 λ²„μ „μœΌλ‘œ κ³΅κ°œν–ˆλ‹€κ³  λ³΄λ„ν–ˆλ‹€. 이 외에도 λ‹€μˆ˜μ˜ κΈ°λŠ₯이 좔가됐닀. 
 μ‚¬μš©μžκ°€ 생성 AI 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 ν•„μš”ν•œ μ•±κ³Ό ν•˜κ³  싢은 일, ν†΅ν•©ν•˜λ €λŠ” 데이터 μ†ŒμŠ€λ₯Ό μ„€λͺ…ν•˜λ©΄ λœλ‹€. λͺ‡λΆ„ λ§Œμ— νŒŒμš΄λ°μ΄μ…˜ μ½”λ”© λͺ¨λΈμ΄ μž…λ ₯을 μ²˜λ¦¬ν•˜κ³  ν…ŒμŠ€νŠΈ 및 배포에 ν•„μš”ν•œ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI)와 μ›Œν¬ν”Œλ‘œλ₯Ό κ°–μΆ˜ μ›ν•˜λŠ” μ „λ¬Έκ°€κΈ‰ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μΆ•ν•œλ‹€.
 AWS에 λ”°λ₯΄λ©΄, μ•± μŠ€νŠœλ””μ˜€λŠ” μž‘μ—… νŠΉμ„±μ— 따라 μ•„λ§ˆμ‘΄ 타이탄, μ•€νŠΈλ‘œν”½ λ“± μ•„λ§ˆμ‘΄ λ² λ“œλ‘μ—μ„œ λŒμ•„κ°€λŠ” λ‹€μ–‘ν•œ λŒ€ν˜•μ–Έμ–΄λͺ¨λΈ(LLM)듀을 ν™œμš©ν•œλ‹€.
 λ˜ AWSλŠ” μ•„λ§ˆμ‘΄ λ² λ“œλ‘μ—μ„œλ§Œ μ œκ³΅ν–ˆλ˜ 'κ°€λ“œλ ˆμΌ' κΈ°λŠ₯을 μ™ΈλΆ€μ—μ„œ μ‚¬μš© 쀑인 타사 λͺ¨λΈμ— λŒ€ν•΄μ„œλ„ μ μš©ν•  수 μžˆλŠ” β€˜κ°€λ“œλ ˆμΌ  API(Guardrails API)’λ₯Ό 프리뷰 λ²„μ „μœΌλ‘œ κ³΅κ°œν–ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μžλŠ” 증였 ν‘œν˜„μ΄λ‚˜ 성적 μš©μ–΄μ™€ 같은 일반적인 κ°€λ“œλ ˆμΌμ„ AI μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ–Όλ§ˆλ‚˜ ν—ˆμš©ν• μ§€ μ‘°μ ˆν•  수 μžˆλ‹€.
 λ”λΆˆμ–΄ κ°€λ“œλ ˆμΌ  API에 λͺ¨λΈκ³Ό AI μ—μ΄μ „νŠΈ, 검색 증강 생성(RAG) μ‹œμŠ€ν…œμ΄ μ‹€μ œλ‘œ νšŒμ‚¬μ˜ 데이터λ₯Ό 읽고 μžˆλŠ”μ§€, μ•„λ‹ˆλ©΄ 사싀을 μ‘°μž‘ν•˜κ³  μžˆλŠ”μ§€ ν…ŒμŠ€νŠΈν•  수 μžˆλŠ” β€˜μ»¨ν…μŠ€νŠΈ κ·ΈλΌμš΄λ”©(Contextual Grounding)β€™μ΄λΌλŠ” κΈ°λŠ₯도 μΆ”κ°€ν–ˆλ‹€.
이 외에도 AWSλŠ” λ² λ“œλ‘μ—μ„œ AI μ—μ΄μ „νŠΈλ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•œ μƒˆλ‘œμš΄ κΈ°λŠ₯듀도 κ³΅κ°œν–ˆλ‹€. AWSλŠ” λ² λ“œλ‘μ— μƒˆλ‘œμš΄ μ½”λ“œ 해석 κΈ°λŠ₯을 μΆ”κ°€, AI λͺ¨λΈμ΄ μ½”λ“œλ‘œ λ³΅μž‘ν•œ 데이터λ₯Ό 뢄석할 수 μžˆλ„λ‘ ν–ˆλ‹€.

 

핡심 μš©μ–΄
  • κ°€λ“œλ ˆμΌμ΄λž€?
    • 고객이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μš”κ΅¬μ‚¬ν•­κ³Ό νšŒμ‚¬μ˜ 인곡지λŠ₯ 정책을 기반으둜 보호쑰치 κ΅¬ν˜„ν•  수 μžˆλŠ” κΈ°λŠ₯
    • μ›μΉ˜ μ•ŠλŠ” μ½˜ν…μΈ  방지 / 즉각적인 곡격(ν”„λ‘¬ν”„νŠΈ μ£Όμž… 및 νƒˆμ˜₯) 차단 / λ―Όκ°ν•œ 정보 제거
  • μ»¨ν…μŠ€νŠΈ κ·ΈλΌμš΄λ”©(Contextual Grounding)μ΄λž€?
    • κΈ°μ—… 데이터에 κΈ°λ°˜ν•˜μ§€ μ•Šκ±°λ‚˜ μ‚¬μš©μžμ˜ 쿼리에 관련이 μ—†λŠ” λͺ¨λΈ μ‘λ‹΅μ—μ„œ ν™˜κ° ν˜„μƒμ„ νƒμ§€ν•˜λŠ” κΈ°λŠ₯

 

β€» Reference β€»

https://aws.amazon.com/ko/blogs/korea/guardrails-for-amazon-bedrock-can-now-detect-hallucinations-and-safeguard-apps-built-using-custom-or-third-party-fms/ (μ•„λ§ˆμ‘΄ κ°€λ“œλ ˆμΌ 및 μ»¨ν…μŠ€νŠΈ κ·ΈλΌμš΄λ”© κ΄€λ ¨ λ‚΄μš©)

https://cloud.google.com/blog/ko/products/ai-machine-learning/how-to-use-grounding-for-your-llms-with-text-embeddings

(κ΅¬κΈ€μ˜ κ·ΈλΌμš΄λ”© 방식)


사내 직원듀이 λ³ΈμΈμ—κ²Œ λ§žλŠ” 앱을 λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•œλ‹€λ©΄ 업무 생산성이 많이 ν–₯상될 수 μžˆμ„ 것 κ°™λ‹€. 아직 프리뷰 λ²„μ „μœΌλ‘œ 곡개된 것이라 μ„±λŠ₯은 어떀지 잘 λͺ¨λ₯΄κ² μ§€λ§Œ 정식 μΆœμ‹œκ°€ 됐을 λ•Œ μ„±λŠ₯이 어떀지 그리고 κΈ°μ—…μ˜ λ°˜μ‘μ€ 어떨지 κΆκΈˆν•˜λ‹€.

ν•΄μ‹œλž€?
ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ λ³€ν™˜ν•œ κ°’을 μΈλ±μŠ€λ‘œ μ‚Όμ•„ ν‚€μ™€ κ°’을 μ €μž₯ν•΄μ„œ λΉ λ₯Έ λ°μ΄ν„° νƒμƒ‰μ„ μ œκ³΅ν•˜λŠ” μžλ£Œκ΅¬μ‘°

 

ν•΄μ‹œμ˜ νŠΉμ§•

  • 단방ν–₯ λ™μž‘ (ν‚€λ₯Ό 톡해 값을 찾을 수 μžˆμ§€λ§Œ 값을 톡해 ν‚€λ₯Ό μ°ΎκΈ° λΆˆκ°€λŠ₯)
  • ν‚€ μžμ²΄κ°€ μΈλ±μŠ€μ΄λ―€λ‘œ 값을 μ°ΎκΈ° μœ„ν•œ 탐색 λΆˆν•„μš”
  • 값을 인덱슀둜 ν™œμš©ν•˜κΈ° μœ„ν•΄ μ μ ˆν•œ λ³€ν™˜κ³Όμ • ν•„μš”

 

ν•΄μ‹œμ˜ λ™μž‘λ°©μ‹

ν•΄μ‹œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우
ν•΄μ‹œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우

ν•΄μ‹œ ν…Œμ΄λΈ”(hash table) : 킀와 λŒ€μ‘ν•œ 값이 μ €μž₯λ˜μ–΄ μžˆλŠ” 곡간

버킷(bucket) : ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 각 데이터

 

ν•΄μ‹œμ˜ νŠΉμ„±μ„ ν™œμš©ν•˜λŠ” λΆ„μ•Ό

단방ν–₯으둜만 검색이 κ°€λŠ₯ν•œ λŒ€μ‹  λΉ λ₯΄κ²Œ μ›ν•˜λŠ” κ°’ 검색 (데이터λ₯Ό μ €μž₯ν•˜κ³  κ²€μƒ‰ν•˜λŠ” 경우 / λ³΄μ•ˆμ΄ ν•„μš”ν•œ κ²½μš°μ— ν™œμš©)

  • λΉ„λ°€λ²ˆν˜Έ 관리 : λΉ„λ°€λ²ˆν˜Έλ₯Ό κ·ΈλŒ€λ‘œ λ…ΈμΆœν•΄ μ €μž₯ν•˜λŠ” κ²ƒμ€ μœ„ν—˜ν•˜λ―€λ‘œ ν•΄μ‹±ν•œ λΉ„λ°€λ²ˆν˜Έ μ €μž₯
  • λ°μ΄ν„°λ² μ΄μŠ€ 인덱싱 : λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 λ°μ΄ν„°λ₯Ό νš¨μœ¨μ μœΌλ‘œ κ²€μƒ‰
  • 블둝체인 : 각 λΈ”둝은 μ΄μ „ λΈ”λ‘μ˜ ν•΄μ‹œκ°’을 ν¬ν•¨ν•˜λ©° μ΄λ₯Ό ν†΅ν•΄ λ°μ΄ν„° λ¬΄κ²°μ„± ν™•μΈ

 

ν•΄μ‹œν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•  λ•Œ κ³ λ €ν•  λ‚΄μš©

  • ν•΄μ‹œ ν•¨μˆ˜κ°€ λ³€ν™˜ν•œ κ°’은 μΈλ±μŠ€λ‘œ ν™œμš©ν•΄μ•Όν•˜λ―€λ‘œ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ ν¬κΈ°λ₯Ό λ„˜μœΌλ©΄ μ•ˆλœλ‹€.
  • ν•΄μ‹œ ν•¨μˆ˜κ°€ λ³€ν™˜ν•œ κ°’μ˜ μΆ©λŒμ€ μ΅œλŒ€ν•œ μ κ²Œ λ°œμƒν•΄μ•Ό ν•œλ‹€.
    (좩돌 : μ„œλ‘œ λ‹€λ₯Έ 두 킀에 λŒ€ν•΄ ν•΄μ‹± ν•¨μˆ˜λ₯Ό μ μš©ν•œ κ²°κ³Όκ°€ λ™μΌν•œ 것을 의미)

 

자주 μ‚¬μš©ν•˜λŠ” ν•΄μ‹œν•¨μˆ˜

1) λ‚˜λˆ—μ…ˆλ²• (division method)

 

β„Ž(π‘₯) = π‘₯ π‘šπ‘œπ‘‘ π‘š
  • x = ν‚€ / m = μ†Œμˆ˜ 
  • ν‚€λ₯Ό μ†Œμˆ˜λ‘œ λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 인덱슀둜 μ‚¬μš© (μΆ©λŒμ„ 쀄이기 μœ„ν•΄ μ†Œμˆ˜ μ‚¬μš©)
  • λ‚˜λ¨Έμ§€λ₯Ό μ·¨ν•˜λŠ” μ—°μ‚°μ„ λͺ¨λ“ˆλŸ¬ μ—°μ‚°μ΄λΌκ³  ν•˜λ©° μ—°μ‚°μžλ‘œ % μ‚¬μš©
  • m을 λͺ¨λ“ˆλŸ¬ μ—°μ‚°ν–ˆμ„ λ•Œ λ‚˜μ˜¬ 수 μžˆλŠ” 값은 0~(m-1)μ΄λ―€λ‘œ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ ν¬κΈ°λŠ” m (큰 μ†Œμˆ˜λ₯Ό μ°ΎκΈ° μ–΄λ €μš΄ 문제)

2) κ³±μ…ˆλ²• (multiplication method)

 

β„Ž(π‘₯) = (((π‘₯ βˆ— 𝐴) π‘šπ‘œπ‘‘ 1) βˆ— π‘š)
  • m = μ΅œλŒ€ λ²„ν‚·μ˜ 개수 / A = ν™©κΈˆλΉ„ (μˆ˜ν•™μ μœΌλ‘œ μž„μ˜μ˜ 길이λ₯Ό λ‚˜λˆ„μ—ˆμ„ λ•Œ 전체:κΈ΄ λΆ€λΆ„ = κΈ΄ λΆ€λΆ„:짧은 뢀뢄인 λΉ„μœ¨)
  • κ³±μ…ˆλ²•μ„ κ³„μ‚°ν•˜λŠ” 방식
    • 킀에 ν™©κΈˆλΉ„ κ³±ν•˜κΈ°
    • μœ„μ—μ„œ κ΅¬ν•œ κ°’μ˜ λͺ¨λ“ˆλŸ¬ 1 μ·¨ν•˜κΈ° (μ •μˆ˜ λΆ€λΆ„을 λ²„리고 μ†Œμˆ˜ λΆ€λΆ„ μ·¨ν•˜κΈ°)
    • μœ„μ—μ„œ κ΅¬ν•œ κ°’을 κ°€μ§€κ³  μ‹€μ œ ν•΄μ‹œ ν…Œμ΄λΈ”에 λ§€ν•‘

 

λ¬Έμžμ—΄ ν•΄μ‹±

β„Žπ‘Žπ‘ β„Ž(𝑠) = (𝑠[0] + 𝑠[1] βˆ— 𝑝 + 𝑠[2] βˆ— 𝑝2 … 𝑠[π‘›βˆ’1] βˆ— 𝑝n-1) π‘šπ‘œπ‘‘ π‘š
  • λ¬Έμžμ—΄μ˜ λ¬Έμžλ₯Ό μˆ«μžλ‘œ λ³€ν™˜ν•˜κ³  μ΄ μˆ«μžλ“€μ„ λ‹€ν•­μ‹μ˜ κ°’μœΌλ‘œ λ³€ν™˜ν•΄μ„œ ν•΄μ‹±
  • ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ μš©ν•œ 값이 ν•΄μ‹œ ν…Œμ΄λΈ” 크기에 λΉ„ν•΄ λ„ˆλ¬΄ 클 경우 μˆ˜μ • μž‘μ—… ν•„μš”
    β†’ λ§μ…ˆμ„ μ „λΆ€ ν•œ λ‹€μŒ λͺ¨λ“ˆλŸ¬ μ—°μ‚°μ„ ν•˜λŠ” λŒ€μ‹  μ€‘간쀑간 λͺ¨λ“ˆλŸ¬ μ—°μ‚°μ„ ν•΄ λ”ν•œκ°’μ„ λͺ¨λ“ˆλŸ¬ μ—°μ‚°

 

좩돌 처리

좩돌(collision) : μ„œλ‘œ λ‹€λ₯Έ 킀에 λŒ€ν•΄ ν•΄μ‹œ ν•¨μˆ˜μ˜ 결과값이 같은 것 (ν•˜λ‚˜μ˜ 버킷에 2개의 값을 λ„£dj 좩돌 μ²˜λ¦¬κ°€ ν•„μš”)

 

1) μ²΄μ΄λ‹μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ°

체이닝 : 좩돌이 λ°œμƒν•˜λ©΄ ν•΄λ‹Ή 버킷에 λ§ν¬λ“œλ¦¬μŠ€νŠΈλ‘œ 같은 ν•΄μ‹œκ°’μ„ κ°€μ§€λŠ” 데이터 μ—°κ²°

  • ν•΄μ‹œ ν…Œμ΄λΈ” 곡간 ν™œμš©μ„±μ΄ 떨어진닀. (좩돌이 λ§Žμ•„μ§€λ©΄ λ§ν¬λ“œλ¦¬μŠ€νŠΈμ˜ 길이가 κΈΈμ–΄μ Έ ν•΄μ‹œ ν…Œμ΄λΈ” 곡간 μ‚¬μš©λ„β†“)
  • 검색 μ„±λŠ₯이 떨어진닀. (좩돌이 많으면 λ§ν¬λ“œλ¦¬μŠ€νŠΈ 자체의 ν•œκ³„λ‘œ 검색 μ„±λŠ₯ μ €ν•˜)

2) 개방 μ£Όμ†Œλ²•μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ°

개방 μ£Όμ†Œλ²•(open addressing) : 빈 버킷을 μ°Ύμ•„ μΆ©λŒκ°’μ„ μ‚½μž… β†’ ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ΅œλŒ€ν•œ ν™œμš©ν•˜λ―€λ‘œ 효율적 λ©”λͺ¨λ¦¬ μ‚¬μš©

  • μ„ ν˜• 탐사 방식 (linear probing) 
    • 좩돌이 λ°œμƒν•˜λ©΄ λ‹€λ₯Έ 빈 버킷을 찾을 λ•ŒκΉŒμ§€ μΌμ •ν•œ κ°„κ²©μœΌλ‘œ 이동
    • ν•΄μ‹œ 좩돌이 λ°œμƒν•œ 값끼리 λͺ¨μ΄λŠ” μ˜μ—­μ΄ 생겨 ν΄λŸ¬μŠ€ν„° ν˜•μ„± (μ΄λŸ¬ν•œ κ΅°μ§‘이 μƒκΈ°λ©΄ ν•΄μ‹œκ°’이 κ²ΉμΉ  ν™•λ₯  μ¦κ°€)
  • 이쀑 ν•΄μ‹± 방식
    • ν•΄μ‹œ ν•¨μˆ˜λ₯Ό 2개 μ‚¬μš©
    • 두 번째 ν•΄μ‹œν•¨μˆ˜λŠ” 첫 번째 ν•΄μ‹œν•¨μˆ˜λ‘œ 좩돌이 λ°œμƒν•˜λ©΄ ν•΄λ‹Ή μœ„μΉ˜ κΈ°μ€€ μ–΄λ–»κ²Œ μœ„μΉ˜λ₯Ό 정할지 κ²°μ •ν•˜λŠ” μ—­ν• 
    • μ„ ν˜• 탐사와 λΉ„μŠ·ν•˜κ²Œ λ”ν•˜λŠ” λ°©μ‹μ΄μ§€λ§Œ μ£Όμ–΄μ§€λŠ” ν‚€λ§ˆλ‹€ μ ν”„ν•˜λŠ” μœ„μΉ˜λ₯Ό λ‹€λ₯΄κ²Œ ν•΄μ„œ ν΄λŸ¬μŠ€ν„° ν˜•μ„± κ°μ†Œ

 

ν•΄μ‹œ 문제의 핡심은 킀와 값을 λ§€ν•‘ν•˜λŠ” κ³Όμ • !!


β€» μ°Έκ³  자료 β€»

https://wikidocs.net/221191

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

문제

 

문제 μ„€λͺ…

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ μ€‘μž…λ‹ˆλ‹€. 각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ” κΈ°λŠ₯보닀 λ¨Όμ € 개발될 수 있고, μ΄λ•Œ 뒀에 μžˆλŠ” κΈ°λŠ₯은 μ•žμ— μžˆλŠ” κΈ°λŠ₯이 배포될 λ•Œ ν•¨κ»˜ λ°°ν¬λ©λ‹ˆλ‹€.
λ¨Όμ € λ°°ν¬λ˜μ–΄μ•Ό ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μž‘μ—…μ˜ μ§„도가 μ νžŒ μ •μˆ˜ λ°°μ—΄ progresses와 κ° μž‘μ—…μ˜ κ°œλ°œ μ†λ„κ°€ μ νžŒ μ •μˆ˜ λ°°μ—΄ speedsκ°€ μ£Όμ–΄μ§ˆ λ•Œ κ° λ°°ν¬λ§ˆλ‹€ λͺ‡ κ°œμ˜ κΈ°λŠ₯이 λ°°ν¬λ˜λŠ”지λ₯Ό return ν•˜λ„둝 solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

 

μ œν•œ 사항

  • μž‘μ—…μ˜ κ°œμˆ˜(progresses, speedsλ°°μ—΄μ˜ κΈΈμ΄)λŠ” 100개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ§„λ„λŠ” 100 λ―Έλ§Œμ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ†λ„λŠ” 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • λ°°ν¬λŠ” ν•˜λ£¨μ— ν•œ 번만 ν•  수 있으며, ν•˜λ£¨μ˜ 끝에 이루어진닀고 κ°€μ •ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ§„λ„μœ¨μ΄ 95%인 μž‘μ—…μ˜
    개발 속도가 ν•˜λ£¨μ— 4%라면 λ°°ν¬λŠ” 2일 뒀에 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예

progresses speeds return
[93, 30, 55] [1, 30, 5] [2, 1]
[95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1] [1, 3, 2]

 

 

μ†ŒμŠ€ μ½”λ“œ
# 1
import math

def solution(progresses, speeds):
    n = len(progresses)
    answers = []

    # 각 μž‘μ—…μ΄ 100% 되기 μœ„ν•΄ κ±Έλ¦¬λŠ” μ‹œκ°„
    times = [math.ceil((100-progresses[i])/speeds[i]) for i in range(n)]

    cnt = 1                 # μ™„λ£Œλœ μž‘μ—…μ˜ 수
    max_time = times[0]     # 첫 번째 μž‘μ—…μ˜ μ‹œκ°„μ„ max_time으둜 지정

    # μ‹œκ°„ 리슀트λ₯Ό λŒλ©΄μ„œ max_timeκ³Ό 비ꡐ
    for i in range(1,n):
        if times[i] <= max_time:    # 1. ν•„μš”ν•œ μ‹œκ°„μ΄ max_time보닀 적으면
            cnt += 1                #    μž‘μ—…μ΄ μ™„λ£Œλœ κ²ƒμ΄λ―€λ‘œ μž‘μ—…μ˜ 수 +1
        else:                       # 2. ν•„μš”ν•œ μ‹œκ°„μ΄ max_time보닀 많으면
            answers.append(cnt)     #    ν˜„μž¬κΉŒμ§€ μ™„λ£Œν•œ μž‘μ—…μ˜ 수λ₯Ό answers에 μΆ”κ°€
            max_time = times[i]     #    max_time을 ν˜„μž¬ μž‘μ—…μ˜ λ‚¨μ€μ‹œκ°„μœΌλ‘œ λ³€κ²½
            cnt = 1                 #    μž‘μ—…μ˜ 수 μ΄ˆκΈ°ν™”
    
    answers.append(cnt)             # 3. λ§ˆμ§€λ§‰ μž‘μ—…μ΄ μΆ”κ°€λ˜μ§€ μ•Šκ³  forλ¬Έ μ’…λ£Œλ˜μ—ˆμœΌλ―€λ‘œ λ§ˆμ§€λ§‰ μž‘μ—… 수 μΆ”κ°€
        
    return answers

 

풀이 #1

  • 주어진 μž‘μ—…μ˜ 수λ₯Ό n으둜 μ •μ˜
  • μ•„λž˜μ˜ 곡식을 μ°Έκ³ ν•˜μ—¬ 각 μž‘μ—…μ΄ μ™„λ£Œλ˜λ €λ©΄ κ±Έλ¦¬λŠ” μ‹œκ°„μ„ times 리슀트둜 생성
    • progresses(ν˜„μž¬ μ™„λ£Œλœ μž‘μ—…μ˜ 정도) + (speeds(μž‘μ—…μ˜ 속도) * times(μž‘μ—… μ‹œκ°„) = 100%
  • cnt : μ™„λ£Œλœ μž‘μ—…μ˜ 수 / max_time : μ•žλΆ€λΆ„ μž‘μ—…μ΄ μ™„λ£Œλ˜λ €λ©΄ κ±Έλ¦¬λŠ” μ‹œκ°„
  • ν˜„μž¬ μž‘μ—…μ˜ 남은 μ‹œκ°„(times[i])κ³Ό 기쀀이 λ˜λŠ” μ‹œκ°„(max_time)을 비ꡐ
    • times[i] κ°€ max_time보닀 적닀면 ν˜„μž¬μ˜ μž‘μ—…μ΄ μ™„λ£Œλœ κ²ƒμ΄λ―€λ‘œ cnt + 1
    • times[i]κ°€ max_time보닀 λ§Žλ‹€λ©΄ μž‘μ—…μ΄ μ™„λ£Œλ˜κΈ°κΉŒμ§€ μ‹œκ°„μ΄ 더 ν•„μš”ν•œ 것
      • ν˜„μž¬κΉŒμ§€ μ™„λ£Œλœ μž‘μ—…μ˜ 수λ₯Ό answers에 μΆ”κ°€
      • 기쀀이 λ˜λŠ” μ‹œκ°„(max_time)을 ν˜„μž¬ μ‹œκ°„μœΌλ‘œ λ°”κΎΈκ³  cnt도 μ΄ˆκΈ°ν™”

 

# 2
def solution(progresses, speeds):
    answers = []
    time = 0    # μž‘μ—…μ΄ ν•„μš”ν•œ μ‹œκ°„
    cnt = 0     # μ™„λ£Œλœ μž‘μ—…μ˜ 수

    while len(progresses) > 0:
    	# 1. 진행 상황이 100 이상이 된 경우
        if(progresses[0] + time * speeds[0]) >= 100:
            progresses.pop(0)   # μž‘μ—…μ΄ μ™„λ£Œλœ κ²ƒμ΄λ―€λ‘œ progressesμ—μ„œ ν•΄λ‹Ή μž‘μ—… 제거
            speeds.pop(0)       # μž‘μ—…κ³Ό μ†λ„μ˜ 인덱슀λ₯Ό λ§žμΆ”μ–΄μ•Ό ν•˜λ―€λ‘œ speedsμ—μ„œλ„ 제거
            cnt += 1            # μž‘μ—…μ˜ 수 + 1
        # 2. 진행 상황이 100 미만인 경우
        else:
            if cnt > 0:                 # μ™„λ£Œλœ μž‘μ—…μ΄ μžˆλ‹€λ©΄
                answers.append(cnt)     # ν˜„μž¬κΉŒμ§€ μ™„λ£Œν•œ μž‘μ—…μ„ answers에 μΆ”κ°€
                cnt = 0                 # μž‘μ—…μ˜ 수 μ΄ˆκΈ°ν™”
            else:                       # μ™„λ£Œλœ μž‘μ—…μ΄ μ—†λ‹€λ©΄
                time += 1               # ν•„μš”ν•œ μ‹œκ°„μ„ μΆ”κ°€
    
    # 3. λ§ˆμ§€λ§‰ μž‘μ—…μ΄ μΆ”κ°€λ˜μ§€ μ•Šκ³  whileλ¬Έ μ’…λ£Œλ˜μ—ˆμœΌλ―€λ‘œ λ§ˆμ§€λ§‰ μž‘μ—… 수 μΆ”κ°€
    answers.append(cnt)

    return answers

 

풀이 #2

  • μž‘μ—…μ΄ ν•„μš”ν•œ μ‹œκ°„κ³Ό μ™„λ£Œλœ μž‘μ—…μ˜ 수λ₯Ό 각각 time, cnt둜 μ •μ˜
  • 진행 쀑인 μž‘μ—…μ΄ μžˆλŠ” 리슀트(progresses)의 길이가 0보닀 크면 μ•„λž˜μ˜ λ‚΄μš©μ„ λ°˜λ³΅ν•΄μ„œ 진행
    • μ•„λž˜μ˜ 곡식이 100이상이면 μž‘μ—…μ΄ μ™„λ£Œλœ κ²ƒμ΄λ―€λ‘œ progresses와 speedμ—μ„œ ν•΄λ‹Ή μž‘μ—… 제거
      • progresses(ν˜„μž¬ μ™„λ£Œλœ μž‘μ—…μ˜ 정도) + (speeds(μž‘μ—…μ˜ 속도) * times(μž‘μ—… μ‹œκ°„) = 100%
      • μ™„λ£Œλœ μž‘μ—…μ˜ 수 cnt + 1
    • cntκ°€ 0보닀 크닀면 μ™„λ£Œλœ μž‘μ—…μ΄ μžˆλŠ” κ²ƒμ΄λ―€λ‘œ answers에 μ™„λ£Œλœ μž‘μ—…μ˜ 수 μΆ”κ°€ν•˜κ³  μ΄ˆκΈ°ν™”
    • μ™„λ£Œλœ μž‘μ—…μ΄ μ—†λ‹€λ©΄ μ‹œκ°„μ΄ 더 ν•„μš”ν•œ κ²ƒμ΄λ―€λ‘œ μ‹œκ°„μ„ μΆ”κ°€

 

μ‰½κ²Œ 풀릴 것 κ°™μ•˜λŠ”λ° μ€κ·Όνžˆ ν’€κΈ° μ–΄λ €μš΄ λ¬Έμ œμ˜€λ‹€.....κ±Έλ¦¬λŠ” μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ 두고 λΉ„κ΅ν•˜λŠ” 방법과 진행상황을 νŒλ‹¨ν•΄μ„œ λΉ„κ΅ν•˜λŠ” 2가지 방법이 μžˆμ–΄μ„œ νŽΈν•œ λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ 쒋을 것 κ°™λ‹€.
 

메타, 1λΆ„ λ§Œμ— 3D μ—μ…‹ μƒμ„±ν•˜λŠ” β€˜λ©”타 3D μ  β€™ κ³΅κ°œ (링크)

기사 λ‚΄μš© μš”μ•½
메타가 ν…μŠ€νŠΈ μ„€λͺ…μœΌλ‘œ 1λΆ„ λ§Œμ— κ³ ν’ˆμ§ˆ 3D 에셋(assets)을 μƒμ„±ν•˜λŠ” μƒˆλ‘œμš΄ 인곡지λŠ₯(AI) 도ꡬλ₯Ό κ³΅κ°œν–ˆλ‹€.
3D젠은 β–²ν…μŠ€νŠΈ-3D ν˜•νƒœ 생성을 μœ„ν•œ '3D 에셋젠(AssetGen)'κ³Ό β–²ν…μŠ€νŠΈ-질감 생성을 μœ„ν•œ '3D ν…μŠ€μ²˜μ  (TextureGen)' κΈ°μˆ μ„ ν†΅ν•©ν•œ 것이닀. 또 물리 기반 λ Œλ”λ§(PBR)을 지원, λ‹€μ–‘ν•œ μ‘°λͺ… μ‘°κ±΄μ—μ„œ 사싀적인 3D 에셋을 생성할 수 μžˆλ‹€.
3D젠은 첫 λ‹¨κ³„μ—μ„œ ν…μŠ€νŠΈ ν”„λ‘¬ν”„νŠΈλ₯Ό 기반으둜 초기 3D 에셋을 μƒμ„±ν•œλ‹€. 이 κ³Όμ •μ—μ„œ 질감과 PBR 맡이 ν¬ν•¨λœ 3D λ©”μ‹œ(mesh)κ°€ 30초 μ•ˆμ— 좜λ ₯λœλ‹€. κ·Έ λ‹€μŒ μ „ λ‹¨κ³„μ—μ„œ μƒμ„±λœ 3D 에셋을 기반으둜 더 높은 ν’ˆμ§ˆμ˜ 질감 및 PBR 맡을 20초 λ§Œμ— μƒμ„±ν•œλ‹€. 또 μƒˆλ‘œμš΄ ν…μŠ€νŠΈ ν”„λ‘¬ν”„νŠΈλ‘œ 이전 단계 μƒμ„±λ¬Όμ΄λ‚˜ 3D λ©”μ‹œμ— λŒ€ν•œ μ§ˆκ°μ„ ν‘œν˜„ν•  수 μžˆλ‹€. 
μƒ˜ν”Œ μ˜μƒλ§Œ κ³΅κ°œν–ˆκΈ° λ•Œλ¬Έμ—, μ‹€μ œ μ„±λŠ₯은 κ²€μ¦λ˜μ§€ μ•Šμ•˜λ‹€. κ·ΈλŸ¬λ‚˜ 짧은 μ‹œκ°„μ— κ³ ν’ˆμ§ˆ 3D 에셋을 생성할 수 μžˆλ‹€λŠ” 것은 λΆ„λͺ…ν•œ 강점이닀.

 

핡심 μš©μ–΄
  • 3D 에셋(assets)μ΄λž€?
    • 3D μ½˜ν…μΈ λ₯Ό λ§Œλ“œλŠ”λ° ν•„μš”ν•œ μΊλ¦­ν„°λ‚˜ λ°°κ²½ λ“±μ˜ μš”μ†Œ
    • 이λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μ €μž‘κΆŒκΉŒμ§€ ν¬ν•¨ν•œ κ°œλ…
  • 물리 기반 λ Œλ”λ§(PBR, Physically Based Rendering )μ΄λž€?
    • μ‘°λͺ…κ³Ό 재질 μ†μ„±μ˜ μƒν˜Έ μž‘μš© 방식을 μ •ν™•ν•˜κ²Œ κ΅¬ν˜„ν•˜λŠ” 쉐이딩 및 λ Œλ”λ§ 기법
    • 물리적으둜 μ •ν™•ν•œ μ§€μ μ—μ„œ 에셋을 κ΅¬ν˜„ν•˜λŠ” 것이 λͺ©ν‘œ
  • 3D λ©”μ‹œ(mesh)
    • 점, μ„ , 면으둜 이루어진 κ·Έλž˜ν”½ λͺ¨λΈ

 

β€» Reference β€»

https://www.aitimes.com/news/articleView.html?idxno=147639 (3D 에셋 κ΄€λ ¨ 기사)

https://www.adobe.com/kr/products/substance3d/discover/pbr.html (PBR κ°œλ… 및 이점에 λŒ€ν•œ λ‚΄μš©)

https://www.3dsolution.kr/82 (λ©”μ‹œμ˜ κ°œλ… 및 3D μŠ€μΊ”μ˜ κΈ°λ³Έ 원리)


3D κ΄€λ ¨ 기사도 μ’…μ’… λ³΄μ΄λŠ”λ° 잘 λͺ¨λ₯΄κ² μ§€λ§Œ...3D λΆ„μ•Όμ—μ„œλ„ μƒμ„±ν˜• AIλ₯Ό ν™œμš©ν•˜κ³  μžˆλ‹€λŠ” 것이 ν₯λ―Έλ‘œμ›Œμ„œ μ½μ–΄λ³΄μ•˜λ‹€. μ„±λŠ₯이 어떨지 ν…ŒμŠ€νŠΈ 결과도 κΆκΈˆν•˜λ‹€. μ„±λŠ₯이 μ–΄λ–¨μ§€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ λΉ λ₯΄κ²Œ 생성할 수 μžˆλ‹€λŠ” 것이 큰 μž₯점인 것 κ°™κ³  μΆ”ν›„ μ„±λŠ₯도 λ†’μ΄λŠ” λ°©ν–₯으둜 λ°œμ „ν•˜κΈΈ κΈ°λŒ€ν•΄λ³Έλ‹€. 🀩

"μš”μ•½, μΊ˜λ¦°λ” κ΄€λ¦¬, ν™”μƒνšŒμ˜κΉŒμ§€ λ§‘κΈ΄λ‹€" μ—…무 κ΅¬μ„κ΅¬μ„ μƒμ‚°μ„± λ†’μ΄λŠ” AI μ•± 8가지 (링크)

기사 λ‚΄μš© μš”μ•½
 μƒμ„±ν˜• AIκ°€ 잘 ν™œμš©λ˜μ–΄ 업무 생산성 ν–₯상에 도움이 될 μœ μš©ν•œ μ•± 8가지λ₯Ό μ†Œκ°œν•œλ‹€.

[λ¬Έμ„œ 및 ν”„λ ˆμ  ν…Œμ΄μ…˜]
1. Chat PDF : μ›Ή 기반 툴둜 PDF, doc, docx νŒŒμΌμ„ μ—…λ‘œλ“œ ν•˜λ©΄ 이에 λŒ€ν•œ μ§ˆμ˜μ‘λ‹΅ κ°€λŠ₯
2. Beautiful.ai : μ›ν•˜λŠ” ν˜•μ‹μœΌλ‘œ ν”„λ ˆμ  ν…Œμ΄μ…˜ μ œμž‘

[이메일]
3. Superhuman : 이메일과 μƒν˜Έμž‘μš©μ— κ³ λ„ν™”λ˜κ³  μ΅œμ ν™”λœ 크둜슀 ν”Œλž«νΌ μ•±μœΌλ‘œ 'AIμ—κ²Œ μ§ˆλ¬Έν•˜κΈ°' κΈ°λŠ₯을 톡해 이메일에 ν¬ν•¨λœ μ‹€μ œ 정보 μš”μ²­ κ°€λŠ₯

[μΊ˜λ¦°λ”]
4. Dola : μ‚¬μš©μžκ°€ μ„ νƒν•œ 4가지 메세지 ν”Œλž«νΌ(μ™“μΈ μ•±/ν…”λ ˆκ·Έλž¨/라인/μ• ν”Œ 메세지)와 λ‹€λ₯Έ μΊ˜λ¦°λ”λ₯Ό 직접 μ—°κ²°

[λ©”λͺ¨ 및 필사]
5. Fathom : μ˜μƒν†΅ν™”λ₯Ό μžλ™μœΌλ‘œ λ…Ήν™”ν•˜μ—¬ μš”μ•½
6. Whisper Web : 이미 λ…ΉμŒλœ λŒ€ν™”λ₯Ό κ°„λ‹¨νžˆ 검색 및 λ‚˜μ€‘μ— μ°Έμ‘°ν•˜λ„λ‘ ν…μŠ€νŠΈλ‘œ λ³€ν™©
7. Summarize.tech : 유튜브 링크λ₯Ό 톡해 λ™μ˜μƒ μ„Έμ…˜μ„ λ‚˜λˆ„μ–΄ μš”μ•½
8. AudioPen : μ‚¬μš©μžμ˜ μŒμ„±μ„ μ˜€λ””μ˜€ λ…ΉμŒμœΌλ‘œ μ €μž₯ν•˜κ³  μš”μ•½ 및 λΆˆν•„μš”ν•œ λΆ€λΆ„ μžλ™ νŽΈμ§‘

 

핡심 μš©μ–΄
  • μ•± 가격 비ꡐ 
  둜그인 ν•„μš”μ—¬λΆ€ μš”κΈˆμ œ
ChatPDF X - ν•˜λ£¨ 2개의 λ¬Έμ„œ 무료
Beautiful.ai O - $144/year (개인 μš”κΈˆμ œ)
- $480/year (νŒ€ μš”κΈˆμ œ)
- $45 (ν”„λ‘œμ νŠΈ λ‹¨ν’ˆ λΉ„μš©)
Superhuman O - $25/month
- $30/month
Dola β–³
(메세지 ν”Œλž«νΌ 둜그인)
- ν˜„μž¬ 초기 μ•‘μ„ΈμŠ€ λ‹¨κ³„μ—μ„œ 무료둜 μ‚¬μš©
  (유료 프리미엄 μ˜΅μ…˜ 좔가될 μ˜ˆμ •)
Fathom O - 일뢀 무료 (핡심기λŠ₯ μ‚¬μš© κ°€λŠ₯)
- $19/month (μ—°κ°„ ꡬ독 μ‹œ $15/month)
Whisper Web X - 무료
Summarize.tech X - ν•˜λ£¨ λͺ‡ 개 λ™μ˜μƒ 무료
- $10/month (ν•œ 달에 200개 λ™μ˜μƒ)
AudioPen X - μ΅œλŒ€ 3λΆ„ 길이, 10개의 μŒμ„± 무료
- $99/year (λ‹€μ–‘ν•œ λΆ€κ°€κΈ°λŠ₯)

 


λ‘œκ·ΈμΈλ„ ν•„μš”μ—†κ³  무료둜 μ‚¬μš©ν•  수 μžˆλŠ” 앱이 λͺ‡ 가지 μžˆμ–΄μ„œ 직접 ν…ŒμŠ€νŠΈλ₯Ό ν•΄λ΄€λŠ”λ° 무료 버전인데도 μ„±λŠ₯이 λ‚˜μ˜μ§€ μ•Šμ•˜λ‹€. ν•œκΈ€ λ¬Έμ„œμ™€ μ˜μƒμ„ 넣어도 μ˜μ–΄λ‘œ 닡변을 ν•΄μ£ΌκΈ΄ ν•˜μ§€λ§Œ....ν•œκΈ€ 지원이 μ•ˆλ˜λŠ” 것은 μ•„λ‹ˆλΌμ„œ μ“Έλ§Œν•œ 것 κ°™λ‹€. DolaλŠ” ν…”λ ˆκ·Έλž¨μœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό ν•΄λ΄€λŠ”λ° 닡변도 ν•œκΈ€λ‘œ λ‚˜μ™€μ„œ μ’‹μ•˜λ‹€. μš”μ¦˜ ν•«ν•œ μƒμ„±ν˜• AI κΈ°λŠ₯듀을 업무에 도움이 λ˜λŠ” λ°©ν–₯으둜 직접 μ‚¬μš©ν•΄λ³΄λ©΄ 쒋을 것 κ°™λ‹€. (업무 쀑에 λ”΄ 짓을 ν•˜λ©°...πŸ‘©πŸ»β€πŸ’»)

큐(Queue)λž€?

λ¨Όμ € λ“€μ–΄κ°„ 데이터가 λ¨Όμ € λ‚˜μ˜€λŠ” 자료ꡬ쑰

  • FIFO(First In First Out) : μ„ μž…μ„ μΆœ
  • push : 큐에 μ‚½μž…ν•˜λŠ” μ—°μ‚° / pop : νμ—μ„œ κΊΌλ‚΄λŠ” μ—°μ‚°

 

큐의 λ™μž‘μ›λ¦¬

초기 λΉ„μ–΄μžˆλŠ” 큐

 

λΉ„μ–΄μžˆλŠ” 큐에 '2'와 '5'λ₯Ό μ°¨λ‘€λŒ€λ‘œ μ‚½μž…

 

νŒμ„ ν•˜λ©΄ λ¨Όμ € λ“€μ–΄κ°€ 있던 '2'κ°€ λ‚˜μ˜€κ³  ν•œ 번 더 μ§„ν–‰ν•˜λ©΄ '5'λ₯Ό 제거

 

큐의 νŠΉμ„±μ„ ν™œμš©ν•˜λŠ” λΆ„μ•Ό

μ—¬λŸ¬ μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ λ°œμƒν•œ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λŠ” μž‘μ—…

  • μž‘μ—… λŒ€κΈ°μ—΄ : λ„€νŠΈμ›Œν¬ 톡신 μ‹œ λ‹€μˆ˜μ˜ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„μ— μž‘μ—…μ„ μš”μ²­ν•˜λ©΄ λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ μž‘μ—… 처리
  • 이벀트 처리 : μ–΄λ–€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©μž 이벀트(ν‚€λ³΄λ“œ/마우슀) 처리

 

큐의 ADT (Abstract Data Type)

  • μŠ€νƒκ³Ό μœ μ‚¬ν•˜μ§€λ§Œ μŠ€νƒμ˜ top β†’ 큐의 front(μ•ž) / rear(λ’€)
    • νλŠ” μ•žμ—μ„œ 데이터λ₯Ό λΉΌκ³  λ’€μ—μ„œ λ„£μœΌλ―€λ‘œ μ•žλ’€ μ΅œμ’…μœ„μΉ˜ μ €μž₯ ν•„μš”
ꡬ뢄 μ •μ˜ μ„€λͺ…
μ—°μ‚° boolean isFull() 큐에 λ“€μ–΄μžˆλŠ” 데이터 κ°œμˆ˜κ°€ maxsize인지 확인해 booleanκ°’ λ°˜ν™˜
(가득 μ°¨ μžˆλ‹€λ©΄ True / μ•„λ‹ˆλ©΄ False)
boolean isEmpty() 큐에 λ“€μ–΄μžˆλŠ” 데이터가 ν•˜λ‚˜λ„ μ—†λŠ”μ§€ 확인해 booleanκ°’ λ°˜ν™˜
(데이터가 ν•˜λ‚˜λΌλ„ 있으면 False / μ•„λ‹ˆλ©΄ True)
void push(Item Tyoe item) 큐에 데이터λ₯Ό ν‘Έμ‹œ
ItemType pop() νμ—μ„œ 처음 ν‘Έμ‹œν•œ 데이터λ₯Ό νŒν•˜κ³  κ·Έ 데이터 λ°˜ν™˜
μƒνƒœ Int front νμ—μ„œ κ°€μž₯ λ§ˆμ§€λ§‰μ— νŒν•œ λ°μ΄ν„°μ˜ μœ„μΉ˜λ₯Ό 기둝
Int rear νμ—μ„œ μ΅œκ·Όμ— ν‘Έμ‹œν•œ λ°μ΄ν„°μ˜ μœ„μΉ˜λ₯Ό 기둝
ItemType data[maxsize] 큐의 데이터λ₯Ό κ΄€λ¦¬ν•˜λŠ” λ°°μ—΄ (μ΅œλŒ€ maxsize개의 데이터 관리)

 

큐의 μ„ΈλΆ€λ™μž‘

큐의 기본ꡬ쑰
큐에 데이터λ₯Ό μΆ”κ°€ν•˜λŠ” 경우 (push)

 

νμ—μ„œ 데이터λ₯Ό κΊΌλ‚΄λŠ” 경우 (pop)

 

데이터λ₯Ό 계속 μΆ”κ°€ν•˜λŠ” 경우 (push)

 

큐 κ΅¬ν˜„ν•˜κΈ°

1) 리슀트λ₯Ό ν™œμš©ν•˜λŠ” 방식

  • push : append( )
  • pop : pop( )
    •  μ²« 번째 데이터λ₯Ό μ œκ±°ν•΄μ•Ό ν•˜λ―€λ‘œ pop(0) μ‚¬μš©
queue = []

# 큐에 데이터 μΆ”κ°€
queue.append(1)
queue.append(2)
queue.append(3)

# 큐의 맨 μ•ž 데이터 제거
first_item = queue.pop(0)
print(first_item)

# 큐에 데이터 μΆ”κ°€
queue.append(4)
queue.append(5)

# 큐의 맨 μ•ž 데이터 제거
first_item = queue.pop(0)
print(first_item)

 

2) 덱을 ν™œμš©ν•˜λŠ” 방식

  • DEQ(Double Ended Queue)
  • μ–‘ λμ—μ„œ μ‚½μž…μ΄λ‚˜ μ‚­μ œν•  수 μžˆλŠ” 큐λ₯Ό κ΅¬ν˜„ν•œ 것
from collections import deque

queue = deque()

# 큐에 데이터 μΆ”κ°€
queue.append(1)
queue.append(2)
queue.append(3)

# 큐의 맨 μ•ž 데이터 제거
first_item = queue.popleft()
print(first_item)

# 큐에 데이터 μΆ”κ°€
queue.append(4)
queue.append(5)

# 큐의 맨 μ•ž 데이터 제거
first_item = queue.popleft()
print(first_item)

β€» μ°Έκ³  자료 β€»

https://wikidocs.net/221191

https://school.programmers.co.kr/learn/courses/30/lessons/42584

 

문제

 

문제 μ„€λͺ…

초 λ‹¨μœ„λ‘œ κΈ°λ‘λœ μ£Όμ‹κ°€κ²©μ΄ λ‹΄κΈ΄ λ°°μ—΄ pricesκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, κ°€κ²©μ΄ λ–¨μ–΄μ§€μ§€ μ•Šμ€ κΈ°κ°„은 λͺ‡ μ΄ˆμΈμ§€λ₯Ό return ν•˜λ„둝 solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

 

 

μ œν•œ 사항

  • prices의 κ° κ°€κ²©μ€ 1 μ΄μƒ 10,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • prices의 κΈΈμ΄λŠ” 2 μ΄μƒ 100,000 μ΄ν•˜μž…λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예

prices return
[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]

 

 

μ†ŒμŠ€ μ½”λ“œ
# 1
def solution(prices):
    n = len(prices)
    answer = []

    for i in range(n):
        idx = 0
        for j in range(i+1,n):
            if prices[j] < prices[i]:   # ν˜„μž¬ 주식가격보닀 떨어진 경우
                idx = j                 # 떨어진 μ‹œμ μ„ idx에 μ €μž₯ν•˜κ³  μ’…λ£Œ
                break

        if idx==0:                      # ν˜„μž¬ μ£Όμ‹κ°€κ²©μ—μ„œ 떨어지지 μ•Šμ€ 경우
            answer.append(n-i-1)        # 전체 κΈΈμ΄μ—μ„œ ν˜„μž¬ 인덱슀λ₯Ό λΊ€ κ°’
        else:
            answer.append(idx-i)        # 떨어진 μ‹œμ μ—μ„œ ν˜„μž¬ 인덱슀λ₯Ό λΊΈ κ°’

    return(answer)

 

풀이 # 1

  • ν˜„μž¬μ˜ 주식가격은 iλ²ˆμ§Έμ— μžˆλŠ” 값이고 λ‚˜λ¨Έμ§€ 주식가격은 jλ²ˆμ§Έμ— μžˆλŠ” κ°’
  • ν˜„μž¬ 주식가격과 λ‚˜λ¨Έμ§€ 주식가격을 λΉ„κ΅ν•΄μ„œ 가격이 λ–¨μ–΄μ§€λŠ” μ‹œμ μ„ idx에 μ €μž₯
    • 가격이 λ–¨μ–΄μ‘Œλ‹€λ©΄ forλ¬Έ λΉ μ Έλ‚˜μ˜€κΈ°
  • idxκ°€ 0이면 가격이 떨어지지 μ•Šμ€ κ²ƒμ΄λ―€λ‘œ μ „μ²΄κΈΈμ΄μ—μ„œ ν˜„μž¬ μ£Όμ‹κ°€κ²©μ˜ 인덱슀 λΉΌκΈ°
  • idxκ°€ 0이 μ•„λ‹ˆλ©΄ 가격이 떨어진 μ‹œμ μ΄ idxμ΄λ―€λ‘œ 떨어진 μ‹œμ μ—μ„œ ν˜„μž¬ 인덱슀 λΉΌκΈ°

 

# 2
def solution(prices):
    n = len(prices)
    answer = [0] * n     

    for i in range(n):
        for j in range(i+1, n):
            answer[i] += 1
            if prices[i] > prices[j]:   # 가격이 떨어진 경우
                break                   # forλ¬Έ μ’…λ£Œ

    return answer

 

풀이 #2

  • 주식가격 길이만큼의 리슀트 생성
  • ν˜„μž¬ 주식가격은 iλ²ˆμ§Έμ— μžˆλŠ” 값이고 λ‚˜λ¨Έμ§€ 주식가격은 jλ²ˆμ§Έμ— μžˆλŠ” κ°’
  • answer λ¦¬μŠ€νŠΈμ— 1을 λ”ν•˜κ³  가격이 λ–¨μ–΄μ‘Œλ‹€λ©΄ for문을 μ’…λ£Œ
    • 가격이 떨어지지 μ•Šμ•˜λ‹€λ©΄ for문으둜 λŒλ©΄μ„œ +1 연산을 진행

 

μ²˜μŒμ—λŠ” 문제 이해가 μ•ˆλμ—ˆλŠ”λ° λ‹¨μˆœν•˜κ²Œ μƒκ°ν•΄λ³΄λ‹ˆ ν˜„μž¬ 인덱슀 κ°’κ³Ό λ‚˜λ¨Έμ§€ 인덱슀 값을 λΉ„κ΅ν•΄μ„œ 가격이 떨어지기 μ „κΉŒμ§€ μ‹œκ°„μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμ˜€λ‹€. 정확도와 νš¨μœ¨μ„±μ„ λͺ¨λ‘ ν…ŒμŠ€νŠΈν•˜λŠ” λ¬Έμ œλΌμ„œ μ–΄λ ΅κ²Œ μƒκ°ν–ˆμ—ˆλŠ”λ° ν•„μš”μ—†λŠ” 연산을 μ§€μš°κ³  주식가격이 λ–¨μ–΄μ§€λŠ” μˆœκ°„κΉŒμ§€λ§Œ 연산을 μ§„ν–‰ν•˜λ‹ˆ μ˜μ™Έλ‘œ μ‰½κ²Œ ν’€ 수 μžˆμ—ˆλ‹€.

+ Recent posts