[μ€μννΈ μκ³ λ¦¬μ¦] νλ‘κ·Έλλ¨Έμ€: μμ κ²μ
λ¬Έμ
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)μ μκ°λ³΅μ‘λλ‘ μ μλ€μ κ°μλ₯Ό μμλΌ μ μμ΅λλ€.
μ½λ
import Foundation | |
func makeCombination(comb:[Bool], combGroup: inout [[Bool]]) { | |
if comb.count == 4 { | |
combGroup.append(comb) | |
return | |
} | |
makeCombination(comb: comb + [true], combGroup: &combGroup) | |
makeCombination(comb: comb + [false], combGroup: &combGroup) | |
} | |
func binarySearch(scores:[Int], target: Int) -> Int { | |
var left = 0 | |
var right = scores.count - 1 | |
var mid = 0 | |
while left <= right { | |
mid = (left + right) / 2 | |
if scores[mid] >= target { | |
left = mid + 1 | |
} else { | |
right = mid - 1 | |
} | |
} | |
return left | |
} | |
func solution(_ info:[String], _ query:[String]) -> [Int] { | |
var combinations: [[Bool]] = [] | |
makeCombination(comb: [], combGroup: &combinations) | |
var answer: [Int] = [] | |
var dict: [String:[Int]] = [:] | |
for row in info { | |
var rowValues = row.components(separatedBy: " ") | |
let score = Int(rowValues.removeLast())! | |
for combination in combinations { | |
var rowKey = rowValues | |
for i in 0..<combination.count { | |
if combination[i] { | |
rowKey[i] = "-" | |
} | |
} | |
let key = rowKey.joined() | |
if dict[key] == nil { | |
dict[key] = [score] | |
} else { | |
dict[key]?.append(score) | |
} | |
} | |
} | |
for key in dict.keys { | |
dict[key] = dict[key]?.sorted(by: >) | |
} | |
for request in query { | |
answer.append(0) | |
var req = request.replacingOccurrences(of: " and ", with: " ").components(separatedBy: " ") | |
let score = Int(req.removeLast()) ?? 0 | |
let requestKey = req.joined() | |
if let result = dict[requestKey] { | |
answer[answer.count - 1] = (binarySearch(scores: result, target: score)) | |
} | |
} | |
return answer | |
} | |
assert(solution(["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","python and frontend and senior and chicken 200","cpp and - and senior and pizza 250","- and backend and senior and - 150","- and - and - and chicken 100","- and - and - and - 150"]) == [1,1,1,1,2,4], "wrong") | |
print("correct") |