-
[Javascript] 프로그래머스 큰 수 만들기알고리즘, 자료구조/프로그래머스 2020. 7. 3. 11:44
문제
https://programmers.co.kr/learn/courses/30/lessons/42883
어떤 숫자에서 k개 만큼의 숫자가 제거되었을 때 만들 수 있는 가장 큰 수를 구해야되는 문제이다. Greedy 알고리즘을 사용해 문제를 풀었고, 여기서 Greedy 알고리즘이란 매 순간 최선이라 판단되는 선택을 하면 가장 좋은 방법으로 문제를 해결할 수 있다라고 가정하는 아이디어에서 나온 것이다. 즉 미래는 생각하지 않고 당장 눈 앞에 닥친 문제만 생각하면 되는 것이다. 물론 이 방법으로 모든 문제가 풀리는 것은 아니지만 계산 시간이 적게 걸린다는 장점이 있기 때문에, Greedy 알고리즘으로 풀 수 있는 문제라면 이를 사용해 문제를 해결하는게 효율성측면에서 좋다.
풀이 과정
function solution(num, k) { let answer = []; let i = 0; let rest = num.length - k; // 문자열로 주어진 숫자들을 내림차순 배열로 만든 뒤 중복 제거 let number = [...new Set(num.split('').sort((a, b) => b - a))]; // 남겨진 숫자가 있을 때 동안 while(rest > 0){ let delStart = (num.indexOf(number[i])) + 1; // '큰 숫자를 큰 단위에 적용하면 가장 큰 수를 만들 수 있다'라는 가정하에 진행 // 큰 수부터 작은 수 순서대로 answer에 집어넣는다 answer.push(number[i]); // (한 번 지나간 구간은 되돌아가지 못하기 때문에 아래와같은 조건이 필요하다) // num이 해당 숫자를 안 갖고 있으며 // 추가해야될 숫자 개수 > 인덱스 i번째 뒤에 남은 숫자 개수라면 if(!num.includes(number[i]) || num.slice(delStart).length < rest - 1){ // answer에서 해당 숫자를 빼내고 answer.pop(); // i를 증가시킨다 i++; // num이 해당 숫자를 갖고 있고 // 추가해야될 숫자 개수 < 인덱스 i번째 뒤에 남은 숫자 개수라면 }else{ // num을 delStart부터 끝까지 잘라낸다(즉 i번째를 포함해 이전 범위는 삭제) num = num.slice(delStart); // 추가해야 될 숫자 개수를 감소시킨다 rest--; // i는 0으로 초기화 i = 0; } } return answer.join(''); }
테스트케이스
'알고리즘, 자료구조 > 프로그래머스' 카테고리의 다른 글
프로그래머스 알고리즘 복습하기 (0) 2020.08.04 [Javascript] 프로그래머스 보석 쇼핑 (0) 2020.07.10 [Javascript] 프로그래머스 프린터 (0) 2020.06.30 [Javascript] 프로그래머스 카펫 (0) 2020.06.29 [Javascript] 프로그래머스 H-index (0) 2020.06.26