문제 설명
문제 링크
[프로그래머스[Level2] 큰 수 만들기]
(https://school.programmers.co.kr/learn/courses/30/lessons/42883)
접근 방법
매 순간 최적을 생각하는 그리디로 일정 범위 내에서 가장 큰 수를 찾기(테케10,시간 초과)
for문을 0~numberOfDigits 필요한 범위만큼 설정
안쪽의 for문에서는 k+i만큼 범위를 설정 (why?)
startIndex의 변화로 현재 가장큰수 찾고 그 다음 인덱스를 시작 Index로 설정최소한의 변수 선언으로 최적의 해 도출하기
주어진 number 배열의 길이만큼 for문을 구성
while문을 사용하여
1)k>0 -> 주어진 k만큼 while문을 돌리며
2)answer[answer.length-1] < number[i]-> answer 배열의 맨뒤 원소값을 현재 number[i]와 계속해서 비교하여 number[i]보다 작은경우 빼주기 위해서 ex) 4 1 7 ...=> 4 7 => 7
answer.join("")으로 배열형식을 String 형식으로 조절
.slice(0,number.length-k) 는 ex) "666","44444",... 등 연속되는 숫자인 경우
while문 루프를 돌지 않고 push만 하기 때문에 원하는 자릿수만큼 결과를 리턴하기 위함코드
function solution(number, k) {
var answer = '';
// return 받을 자리수
let numberOfDigits = number.length - k ;
let startIndex = 0;
for(let i=0;i<numberOfDigits; ++i){
let maxValue = -1;
let maxIndex = 0;
// 범위 설정 이유 :
ex) "4177952841" ,k = 4 인 경우 원하는 자릿수 6으로
4 1 7 7 9 | 5 2 8 4 1
↑
앞쪽에서 k+1 범위 내에서 가장 큰 수 : 9 , index : k+1 나머지 5자리를 붙여서 만들어야 하기때문에
for(let j=startIndex; j<=k+i;++j){
if(maxValue<parseInt(number[j])){
maxValue = number[j];
maxIndex = j;
}
}
startIndex = maxIndex+1;
answer+=maxValue
}
return answer;
}
// 테케 10 : 시간 초과
function solution(number, k) {
var answer = [];
for (let i=0;i<number.length;++i){
while(k>0&&answer[answer.length-1]<number[i]){
answer.pop();
k--;
}
// answer : 1 number[1] = 9
// answer : (1) 9 number[2] = 2
// answer : (1) 9 2 number[3] = 4
// answer : (1) 9 (2) 4
answer.push(number[i]);
}
// ex) 똑같은 수 나올 경우 "333" while 문에 들어가지 않고 "333"을 전부 return 하게 되기 때문에 원하는 문자열 만큼을 리턴하게 만들어줌
return answer.join("").slice(0,number.length-k);
}
'알고리즘문제풀이' 카테고리의 다른 글
프로그래머스[Level1] 신고 결과 받기 - JavaScript (0) | 2023.04.19 |
---|---|
프로그래머스[Level2] 조이스틱 - JavaScript (0) | 2023.04.19 |
프로그래머스[Level1] 크기가 작은 부분 문자열 -Javascript (0) | 2023.04.19 |
프로그래머스[Level1] 가장 가까운 같은 글자 -Javascript (0) | 2023.04.19 |
프로그래머스[Level2] 기능 개발 -Javascript (0) | 2023.04.19 |