Problem Solving/프로그래머스

[프로그래머스/JavaScript] 기능개발

세고래 2022. 10. 1. 02:08

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1) 풀이

오랜만에 풀어보는 레벨 2..

예전에 C++로 푼 거기도 하고, 그나마 레벨 2 중에서는 쉬워보여서 선택한 건데

워낙 오랜만에 알고리즘 풀어서 그런지 머리가 넹글넹글 잘 돌아가지 않았다😂

 

이건 뭐 대놓고 스택/큐 문제라고 해놨는데 신경을 안 쓸래야 안 쓸수가 읍지만

일단 저거 상관없이 그냥 내가 생각해본 방법으로 풀어봤다

function solution(progresses, speeds) {
    let answer = [];
    let count=0;
    let flg=true;
    
    while(progresses.length!==0){
        flg=true;
        for(let i=0;i<progresses.length;i++){
            progresses[i]+=speeds[i];
            if(progresses[i]>=100&&flg){
                count+=1;
                progresses.splice(i,1);
                i--;
            }else if(progresses[i]<100) {
                flg=false;
        
            }
        }
        if(count>0) {
            answer.push(count);
            count=0;
        }
    }
    return answer;
}

코드 실행 돌렸을 때 테케 2개는 정답 나오길래 바로 채점 돌려봤더니 결과는 18.2 / 100.0 였다

왜 그런지 한참 생각하고, 한참을 별 의미없는 코드 수정을 하고 있었는데

문득 parameter가 두개 들어온다는 것을 깨달았다!

progresses.splice(i,1) 부분에서, progresses 의 배열은 해당 i 인덱스의 요소가 삭제되는데,

여기에 꾸준히 더해지고 있는 speeds[i] 는 없애주지 않아서 생긴 일이었다 ㅎㅎ,,

speeds에서도 지워주니까 바로 해결!

해당 코드에 대한 자세한 설명은 아래 최종 소스코드에 주석으로 적어놓도록 하고,,

다른 사람의 풀이를 반드시 보는 편인데 진짜 신박한 풀이가 있었다

function solution(progresses, speeds) {
    let answer = [0];
    let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));
    let maxDay = days[0];

    for(let i = 0, j = 0; i< days.length; i++){
        if(days[i] <= maxDay) {
            answer[j] += 1;
        } else {
            maxDay = days[i];
            answer[++j] = 1;
        }
    }

    return answer;
}

map 함수를 개발할 땐 진짜 많이 이용하는데, 알고리즘 풀 때는 이상하게 먼저 생각나지는 않는다

이렇게 푸신 분들은 map 함수를 진짜 유용하게 잘 썼다고 생각하는게,

map 함수로 progress의 값을 꺼내 역으로 100에서 뺀 뒤 작업속도로 나눠서 배포하는 데에 걸리는 날짜를 배열로 반환해주었다 (요런 생각.. 어캐 하나요?)

그런 다음에 제일 처음 요소를 maxDay에 집어넣고, 걸리는 날짜 배열을 탐색하는데 maxDay보다 작거나 같으면

현재 answer 인덱스에 집어넣고, 아니면 maxDay를 해당 요소 값으로 바꾸고 answer 에서 현재 요소 바로 다음 요소에 1을 부여한다

days 탐색 부분이 좀 이해가 안 갔는데, 쉽게 말해서 maxDay보다 작거나 같으면 현재 answer배열의 인덱스, 즉 현재 배포되는 것들과 함께 배포되겠지만 maxDay보다 커버리면 결국 다음날에 배포되어야 하고,

그렇다는 말은 자연스럽게 그 다음 요소들도 다음에 배포되어 버리고 만다 그래서 maxDay도 교체해주고,

answer도 다음 인덱스로 넘어가는 것~ 

 

이 세상엔 진짜 똑똑한 사람들 많다.. 최고시다.. 멋져부러~ 

2) 최종 소스코드
function solution(progresses, speeds) {
    let answer = []; //정답 배열
    let count=0; //한 번에 배포되는 작업 개수
    let flg=true; //speeds의 요소가 100이 넘지 않으면 false로 바꿈. 배포되는 작업 구분하기 위함
    
    while(progresses.length!==0){
        flg=true;
        for(let i=0;i<progresses.length;i++){
            progresses[i]+=speeds[i];
            if(progresses[i]>=100&&flg){
                count++;
                progresses.splice(i,1);
                speeds.splice(i,1);
                i--;
            }else if(progresses[i]<100) {
                flg=false;
        
            }
        }
        if(count>0) {
            answer.push(count);
            count=0;
        }
    }
    return answer;
}

 

728x90