https://school.programmers.co.kr/learn/courses/30/lessons/340212
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
확인 내용
1. 숙련도 : 현재 코딩 테스트 문제에서 return 해줘야하는 값 -> 제한 시간 내에 최소한의 숙련도(범위 중요!!!)
2. 난이도에 따라 숙련도가 높으면 넘어가지만 낮은 경우의 시간 연산 방법 확인 필요
3. 연산된 시간과 제한 시간비교
코드 로직
1. 숙련도를 높이면서 제한 시간과 확인하면서 연산 작업(범위 중요!!!)
2. 계산하는 방법을 인식하고 함수로 만들기(개인적 의견)
3. 숙련도의 최솟값을 return
변수
left, rigth : 숙련도의 범위를 지정하여 연산 작업하기 위한 두 변수 선언 (return은 left)
time : 제한 시간 확인하기 위한 변수
함수
canSolve : 숙련도와 문제들의 난이도 계산하는 함수
중요!!
1. 숙련도의 범위가 중요합니다(런타임 에러 사항 보완)
*** Math.max(...diffs) 하면 런타임 에러 뜸
정말 어떻게 해야하는지 몰랐었는데 덕분에 잘 풀었습니다ㅠㅠ
[프로그래머스] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지
이진 탐색을 하여 풀 수 있는 문제이다. for문으로 전체 반복하고 시간초과를 맞은 후 이진 탐색의 포인트는 잡았는데 right 포인터에 Math.max(...diffs) 선언한 후 런타임 에러 폭탄을 맞았다 대체 테
velog.io
최종코드
// diffs : 난이도
// 현재 퍼즐의 소요시간 : time_cr
// 이전 퍼즐의 소요시간 : time_prev
// 숙련도 : level
function solution(diffs, times, limit) {
// 해석봄
// 투 포인터 설정
let left = 1
let right = 100_001 // Math.max(...diffs) 하면 런타임 에러 뜸
while(left <= right) {
// 이진 탐색을 위한 mid 선언
const mid = Math.floor((left + right) / 2)
if(canSolve(mid)) right = mid - 1
else left = mid + 1
}
function canSolve(level){
var time = 0
for (var i = 0; i<diffs.length; i++){
// 숙련도가 난이도보다 높으면 시간만 추가
if (diffs[i] - level <= 0) time += times[i]
else if (diffs[i] - level > 0){ // 숙련도가 난이도보다 작으면 틀린 것으로 추정
time += (times[i-1] + times[i]) * (diffs[i] - level) + times[i]
}
// console.log(level_temp, diffs[i], times[i], level_temp, time)
}
return time <= limit
}
return left
/*
// 초기 코드
var level = 0;
// 숙련도와 난이도로 비교하기 때문에
// 가장 높은 난이도보다 숙련도가 같거나 낮을때마 반복함
var max_level = Math.max(...diffs);
// level을 ++하여 확인
while(level < max_level){
var level_temp = level+1
var time = 0
// console.log(level_temp, time)
for (var i = 0; i<diffs.length; i++){
// 숙련도가 난이도보다 높으면 시간만 추가
if (diffs[i] - level_temp <= 0) time += times[i]
else if (diffs[i] - level_temp > 0){ // 숙련도가 난이도보다 작으면 틀린 것으로 추정
time += (times[i-1] + times[i]) * (diffs[i] - level_temp) + times[i]
}
// console.log(level_temp, diffs[i], times[i], level_temp, time)
}
level = level_temp
if(time <= limit) break;
}
return level;
*/
}
마무리
하단의 초기 코드로 주석되어 있는 부분이 제가 제일 처음에 작업했던 코드입니다.
하지만 예제 테스트 케이스는 모두 됐지만 제출을 누르면 런타임 에러가 발생합니다.
덕분에 너무 잘 풀었습니다..!

'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [PCCE 기출문제] 10번 / 공원(Java), (feat.90점) (0) | 2024.11.14 |
---|---|
[프로그래머스] [PCCE 기출문제] 9번 / 지폐 접기(Java) (0) | 2024.11.12 |
[프로그래머스] [PCCP 기출문제] 1번 / 붕대 감기(javascript) (3) | 2024.11.09 |
[프로그래머스] [PCCP 기출문제] 1번 / 동영상 재생기(Javascript) (0) | 2024.10.30 |
[프로그래머스]Lv3.이중우선순위큐(Java) (0) | 2023.10.08 |