p_퍼즐게임챌린지_340212
| source | school.programmers.co.kr/learn/course... |
| type | 📌 개발노트 |
| topics | 600-알고리즘 & 코딩테스트 610 이진탐색 |
| types | 문제풀이 |
| 정답여부 | 실수 |
문제
퍼즐난이도 : diff
현퍼즐 소요시간:time_cur
이전퍼즐 소요시간: time_prev
내숙련도 : level
if diff <= level , +=time_cur
if diff > level , diff-level 만큼틀림
틀릴때마다 time_cur + time_prev
만약풀면 앞에꺼 다시안풀어도되니깐 time_cur
limit 시간이 정해져있음
시간안에 해결할 수 있는 최소의 숙련도를 구하라.
답
이분탐색이용하면 될꺼가튼데?
문제를 잘못이해햇다 이전꺼전부를푸는게아니라 바로 이전꺼만 풀면되는것엿다.
그리고 처음에는 Math.max썼는데 이거때매 에러남 인자길이가 너무길어지면 에러가 날 수 있다고 한다.
그리고 숙련도가 양의 정수라는 지문을 뻬먹었엇다.
function solution(diffs, times, limit) {
let start = 0;
let end = 100000;
let mid;
while(start<=end){
let time_prev = 0
mid = parseInt((start+end)/2)
for(let i in diffs){
if(diffs[i]<= mid){
time_prev += times[i]
}else{
let wrong = diffs[i]-mid
let before = i<1? 0: times[i-1]
time_prev += before*wrong + times[i]*(wrong+1)
}
}
// console.log(start,end,mid,time_prev,limit)
if(time_prev === limit) return mid
if(time_prev<limit){
end = mid -1;
}else{
start = mid + 1
}
}
if(start<1) return 1
return start
}