[JavaScript][Programmers] 기능개발

조준형·2021년 7월 5일
0

Algorithm

목록 보기
14/142
post-thumbnail

🔎 기능 개발

❓ 문제링크

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

📄 제출 코드

function solution(progresses, speeds) {
    var answer = [];
    let bepo = []
    for (var i = 0; i < progresses.length; i++) {
        let day = Math.ceil(((100 - progresses[i]) / speeds[i]))
        // console.log(`${i} : ${day}`);
        bepo.push(day)
        i != 0 ? (bepo[i] <= bepo[i - 1] ? bepo[i] = bepo[i - 1] : bepo[i] = bepo[i]) : bepo[i] = bepo[i];
    }
    //console.log(bepo)
    let set = new Set(bepo);
    //console.log(set)
    let setArr = Array.from(set);
    //console.log(setArr)
    //console.log(setArr.length);

    for (var i = 0; i < setArr.length; i++) {
        let cnt = bepo.filter(e => setArr[i] == e).length;
        //console.log(`cnt : ${cnt}`);
        answer.push(cnt);
    }
    return answer;
}

먼저 100에서 진행상황을 뺀거에 걸리는 속도만큼을 나누고, 그 값을 올림한다.
문제에서 95%에 속도가 4%라면 2일뒤에 배포가 이루어진다고 되있다.

또 첫번째 테스트케이스의 경우 첫번째 값 93이 7일걸리고, 두번째 값 30이 4일걸리지만 배포는 7일뒤에 이루어진다.
그래서 bepo배열에 넣고, 첫번째가 아니라면 그 전의 것과 비교해서 그 전의 것이 더 크면 값을 바꾼다.

모든 작업이 끝나면 중복제거를 한 배열을 1개만들고, bepo에 값이 몇개나 들어있는지 세고 answer에 값을 넣어 출력한다.

✏️ 이해하기

초기 코드

function solution(progresses, speeds) {
    var answer = [];
    let bepo = []
    for (var i = 0; i < progresses.length; i++) {
        let day = Math.round(((100 - progresses[i]) / speeds[i]))
        bepo.push(day)
        if (i != 0) {
            if(bepo[i] <= bepo[i - 1]){
                bepo[i] = bepo[i - 1];
            }
        }
    }
    let set = new Set(bepo);
    let setArr = Array.from(set);

    for (var i = 0; i < setArr.length; i++) {
        let cnt = bepo.filter(e => setArr[i] == e).length;
        answer.push(cnt);
    }
    return answer;
}

👉 1. Math.ceil()

처음에 반올림하는 함수 round를 써서 테스트케이스 2번 11번이 틀렸었다.
문제에서 95%에 속도가 4%라면 2일뒤에 배포가 이루어진다고 되있기 때문에 만약 나눈 값이1.33333인 경우 반올림하게되면 1이 되므로 오답이된다.
그래서 무조건 올림을 하는 ceil을 사용해야한다.

👉 2. Set()

set은 배열이 아니라 객체이다. 그래서 출력하게 되면 []이 아니라 {} 형태로 나오게 된다.

값에 index로 접근고, 배열의 메소드를 사용하기 위해서는 배열로 복사해줄 필요가 있다.
또한 set의 크기는 length가 아니라 size!.
(처음에 그냥 set을 사용했다가 filter가 안먹어서 당황했음.)

set을 이용하여 중복을 제거하고, 배열처럼 접근하려면 배열로 복사해서 사용하는 점 주의하자!.
(맨날까먹음 💧;)

🎲 다른 코드

function solution(progresses, speeds) {
    let answer = [];
    let beforeCommitDay = 0;

    progresses.map((a, i) => {
        let day = Math.ceil((100 - a) / speeds[i]);   

        if(day > beforeCommitDay) {
            answer.push(1)
            beforeCommitDay = day 
        }
        else {
            answer[answer.length - 1]++
        }
    })

    return answer;
}

나의 경우에는 day를 계산한 배열을 따로 만들고, 중복제거 하고나서 수를 세기 시작했는데,
위 코드는 map을 이용하여 day를 계산하고, 바로 day를 가지고, answer에 값을 넣어 답을 도출하였다.

📘 참고

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Set

profile
깃허브 : github.com/JuneHyung

0개의 댓글