πŸ’†πŸ»‍♂️ ν”Ό-μ—μŠ€/🐣 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[μŠ€μœ„ν”„νŠΈ μ•Œκ³ λ¦¬μ¦˜] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€: μˆœμœ„ 검색

κ°œλ°œν•˜λŠ” ν›ˆμ΄ 2021. 9. 5. 04:55

문제

https://programmers.co.kr/learn/courses/30/lessons/72412

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μˆœμœ„ 검색

["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt

programmers.co.kr

문제 μ„€λͺ…

[λ³Έ λ¬Έμ œλŠ” μ •ν™•μ„±κ³Ό νš¨μœ¨μ„± ν…ŒμŠ€νŠΈ 각각 μ μˆ˜κ°€ μžˆλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.]

μΉ΄μΉ΄μ˜€λŠ” ν•˜λ°˜κΈ° κ²½λ ₯ 개발자 κ³΅κ°œμ±„μš©μ„ 진행 쀑에 있으며 ν˜„μž¬ μ§€μ›μ„œ μ ‘μˆ˜μ™€ μ½”λ”©ν…ŒμŠ€νŠΈκ°€ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이번 μ±„μš©μ—μ„œ μ§€μ›μžλŠ” μ§€μ›μ„œ μž‘μ„± μ‹œ μ•„λž˜μ™€ 같이 4가지 ν•­λͺ©μ„ λ°˜λ“œμ‹œ μ„ νƒν•˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • μ½”λ”©ν…ŒμŠ€νŠΈ μ°Έμ—¬ κ°œλ°œμ–Έμ–΄ ν•­λͺ©μ— cpp, java, python 쀑 ν•˜λ‚˜λ₯Ό 선택해야 ν•©λ‹ˆλ‹€.
  • 지원 직ꡰ ν•­λͺ©μ— backend와 frontend 쀑 ν•˜λ‚˜λ₯Ό 선택해야 ν•©λ‹ˆλ‹€.
  • 지원 κ²½λ ₯ꡬ뢄 ν•­λͺ©μ— junior와 senior 쀑 ν•˜λ‚˜λ₯Ό 선택해야 ν•©λ‹ˆλ‹€.
  • μ„ ν˜Έν•˜λŠ” μ†ŒμšΈν‘Έλ“œλ‘œ chickenκ³Ό pizza 쀑 ν•˜λ‚˜λ₯Ό 선택해야 ν•©λ‹ˆλ‹€.

μΈμž¬μ˜μž…νŒ€μ— κ·Όλ¬΄ν•˜κ³  μžˆλŠ” λ‹ˆλ‹ˆμ¦ˆλŠ” μ½”λ”©ν…ŒμŠ€νŠΈ κ²°κ³Όλ₯Ό λΆ„μ„ν•˜μ—¬ μ±„μš©μ— μ°Έμ—¬ν•œ κ°œλ°œνŒ€λ“€μ— μ œκ³΅ν•˜κΈ° μœ„ν•΄ μ§€μ›μžλ“€μ˜ 지원 쑰건을 μ„ νƒν•˜λ©΄ ν•΄λ‹Ή 쑰건에 λ§žλŠ” μ§€μ›μžκ°€ λͺ‡ λͺ…인 지 μ‰½κ²Œ μ•Œ 수 μžˆλŠ” 도ꡬλ₯Ό λ§Œλ“€κ³  μžˆμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, κ°œλ°œνŒ€μ—μ„œ κΆκΈˆν•΄ν•˜λŠ” λ¬Έμ˜μ‚¬ν•­μ€ λ‹€μŒκ³Ό 같은 ν˜•νƒœκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.
μ½”λ”©ν…ŒμŠ€νŠΈμ— java둜 μ°Έμ—¬ν–ˆμœΌλ©°, backend 직ꡰ을 μ„ νƒν–ˆκ³ , junior κ²½λ ₯μ΄λ©΄μ„œ, μ†ŒμšΈν‘Έλ“œλ‘œ pizzaλ₯Ό μ„ νƒν•œ μ‚¬λžŒ 쀑 μ½”λ”©ν…ŒμŠ€νŠΈ 점수λ₯Ό 50점 이상 받은 μ§€μ›μžλŠ” λͺ‡ λͺ…인가?

λ¬Όλ‘  이 외에도 각 κ°œλ°œνŒ€μ˜ 상황에 따라 μ•„λž˜μ™€ 같이 λ‹€μ–‘ν•œ ν˜•νƒœμ˜ λ¬Έμ˜κ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ½”λ”©ν…ŒμŠ€νŠΈμ— python으둜 μ°Έμ—¬ν–ˆμœΌλ©°, frontend 직ꡰ을 μ„ νƒν–ˆκ³ , senior κ²½λ ₯μ΄λ©΄μ„œ, μ†ŒμšΈν‘Έλ“œλ‘œ chicken을 μ„ νƒν•œ μ‚¬λžŒ 쀑 μ½”λ”©ν…ŒμŠ€νŠΈ 점수λ₯Ό 100점 이상 받은 μ‚¬λžŒμ€ λͺ¨λ‘ λͺ‡ λͺ…인가?
  • μ½”λ”©ν…ŒμŠ€νŠΈμ— cpp둜 μ°Έμ—¬ν–ˆμœΌλ©°, senior κ²½λ ₯μ΄λ©΄μ„œ, μ†ŒμšΈν‘Έλ“œλ‘œ pizzaλ₯Ό μ„ νƒν•œ μ‚¬λžŒ 쀑 μ½”λ”©ν…ŒμŠ€νŠΈ 점수λ₯Ό 100점 이상 받은 μ‚¬λžŒμ€ λͺ¨λ‘ λͺ‡ λͺ…인가?
  • backend 직ꡰ을 μ„ νƒν–ˆκ³ , senior κ²½λ ₯μ΄λ©΄μ„œ μ½”λ”©ν…ŒμŠ€νŠΈ 점수λ₯Ό 200점 이상 받은 μ‚¬λžŒμ€ λͺ¨λ‘ λͺ‡ λͺ…인가?
  • μ†ŒμšΈν‘Έλ“œλ‘œ chicken을 μ„ νƒν•œ μ‚¬λžŒ 쀑 μ½”λ”©ν…ŒμŠ€νŠΈ 점수λ₯Ό 250점 이상 받은 μ‚¬λžŒμ€ λͺ¨λ‘ λͺ‡ λͺ…인가?
  • μ½”λ”©ν…ŒμŠ€νŠΈ 점수λ₯Ό 150점 이상 받은 μ‚¬λžŒμ€ λͺ¨λ‘ λͺ‡ λͺ…인가?

즉, κ°œλ°œνŒ€μ—μ„œ κΆκΈˆν•΄ν•˜λŠ” λ‚΄μš©μ€ λ‹€μŒκ³Ό 같은 ν˜•νƒœλ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

* [쑰건]을 λ§Œμ‘±ν•˜λŠ” μ‚¬λžŒ 쀑 μ½”λ”©ν…ŒμŠ€νŠΈ 점수λ₯Ό X점 이상 받은 μ‚¬λžŒμ€ λͺ¨λ‘ λͺ‡ λͺ…인가?


[문제]

μ§€μ›μžκ°€ μ§€μ›μ„œμ— μž…λ ₯ν•œ 4κ°€μ§€μ˜ 정보와 νšλ“ν•œ μ½”λ”©ν…ŒμŠ€νŠΈ 점수λ₯Ό ν•˜λ‚˜μ˜ λ¬Έμžμ—΄λ‘œ κ΅¬μ„±ν•œ κ°’μ˜ λ°°μ—΄ info, κ°œλ°œνŒ€μ΄ κΆκΈˆν•΄ν•˜λŠ” 문의쑰건이 λ¬Έμžμ—΄ ν˜•νƒœλ‘œ λ‹΄κΈ΄ λ°°μ—΄ queryκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ,
각 λ¬Έμ˜μ‘°κ±΄μ— ν•΄λ‹Ήν•˜λŠ” μ‚¬λžŒλ“€μ˜ 숫자λ₯Ό μˆœμ„œλŒ€λ‘œ 배열에 λ‹΄μ•„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

풀이

Set을 λ§Œλ“€μ–΄ intersection을 ν•˜λŠ” 방법, λ‹¨μˆœνžˆ 브루트포슀둜 ν‘ΈλŠ” 방법을 λͺ¨λ‘ μ‹œλ„ν•΄λ³΄μ•˜λŠ”λ° μ •ν™•λ„λŠ” ν†΅κ³Όν–ˆμ§€λ§Œ νš¨μœ¨μ„±κ²€μ‚¬λ₯Ό 톡과할 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. μ‹œκ°„λ³΅μž‘λ„λ₯Ό 쀄이렀면 두 가지 뢀뢄을 신경써야 ν•©λ‹ˆλ‹€. 첫 λ²ˆμ§ΈλŠ” 쿼리에 "-"κ°€ μžˆμ„ λ•Œμ˜ νƒμƒ‰μ‹œκ°„μ„ μ€„μ΄λŠ” 것이고, λ‘λ²ˆμ§ΈλŠ” 주어진 점수 μ΄μƒμ˜ 점수λ₯Ό 가진 λ ˆμ½”λ“œλ“€μ„ μ°ΎλŠ” μ‹œκ°„μ„ μ€„μ΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

νƒμƒ‰μ‹œκ°„μ„ 쀄이기 μœ„ν•΄μ„œλŠ” 주어진 μž…λ ₯ 쀑 점수λ₯Ό μ œμ™Έν•œ 쑰건듀과 "-" 으둜 λ§Œλ“€ 수 μžˆλŠ” 쑰합을 미리 λ§Œλ“€μ–΄ λ”•μ…”λ„ˆλ¦¬λ‘œ λ§Œλ“œλŠ” 것이 κ°€μž₯ νš¨κ³Όμ μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, "python and frontend and senior and chicken 200" κ°€ μ£Όμ–΄μ‘Œλ‹€λ©΄ λ‹€μŒκ³Ό 같은 λ”•μ…”λ„ˆλ¦¬ μš”μ†Œλ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

"pythonfrontendseniorchicken" : 200

"-frontendseniorchicken" : 200

"--seniorchicken" : 200

"---chicken" : 200

"----" : 200

.

.

.

"pythonfrontendsenior-" : 200

 

각 μœ„μΉ˜μ— 주어진 정보 ν˜Ήμ€ "-" λ₯Ό μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— 2^4 둜 총 16개의 λ”•μ…”λ„ˆλ¦¬λ₯Ό 성생할 수 μžˆμŠ΅λ‹ˆλ‹€. 같은 λ°©μ‹μœΌλ‘œ λͺ¨λ“  info에 λŒ€ν•΄ ν‚€λ₯Ό λ§Œλ“€κ³ , 이미 μ‘΄μž¬ν•˜λŠ” 킀라면 점수λ₯Ό λ°°μ—΄λ‘œ μΆ”κ°€ν•΄μ£Όλ©΄λ©λ‹ˆλ‹€. 이제 전체 λ”•μ…”λ„ˆλ¦¬ 탐색할 ν•„μš”μ—†μ΄ query둜 keyλ₯Ό λ§Œλ“€μ–΄ κ³§λ°”λ‘œ 점수λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν‚€λ₯Ό μž…λ ₯ν•΄ 얻은 μ μˆ˜λ“€μ—μ„œ 쿼리둜 주어진 점수 μ΄μƒμ˜ μ μˆ˜λ“€μ„ 골라내기 μœ„ν•΄μ„œλŠ” μ™„μ „νƒμƒ‰μœΌλ‘œλŠ” νš¨μœ¨μ„±μ„ 톡과할 수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ μˆ˜λ“€μ„ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜κ³ , 이뢄 νƒμƒ‰μœΌλ‘œ λ°”μš΄λ“œλ₯Ό μ°Ύμ•„ 인덱슀λ₯Ό 개수둜 λ³€ν™˜ν•΄μ„œ μ‚¬μš©ν•˜λ©΄ O(NLogN)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ μ μˆ˜λ“€μ˜ 개수λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ½”λ“œ