고양이와 코딩

[프로그래머스] 알고리즘 12월01일 ~ 12월10일 본문

javascript

[프로그래머스] 알고리즘 12월01일 ~ 12월10일

ovovvvvv 2023. 12. 1. 23:17
728x90

12월01일

같은 숫자는 싫어 - 스택

 

처음에는 arr[i] === arr[i + 1] 일 경우 answer배열에 담고 answer.pop()으로 지우자! 라고 생각했다

근데.. 중간에 중복되지 않는 값은 어떻게 그자리에 삽입해야할지 감이 안왔고..

앞 뒤 숫자가 다를 때 삽입하는 방법으로 수정했다!!

 

function solution(arr)
{
    var answer = [];

    for (let i = 0; i < arr.length; i++){
        if(arr[i] !== arr[i - 1]){
            answer.push(arr[i]);
        }
    }
    
    return answer;
}

처음에는 arr[i] !== arr[i + 1] 로 제출했는데, 테스트케이스도 통과하고 제출했지만 연속된 숫자가 세개 이상일때 문제가 생길 것 같아서
이렇게 수정했다 ㅎㅎ

 

 

기능개발

 

내 풀이

function solution(progresses, speeds) {
    var answer = [];
    let day = [];
    
    for (let i = 0; i <progresses.length; i++){
        day[i] = Math.ceil((100 - progresses[i]) / speeds[i]);
        
        if(day[i - 1] > day[i]){
           day[i] = day[i - 1];
           }
        }
    
    day.forEach((value) => {
        answer[value] = (answer[value] || 0) + 1;
    });
    
    return answer.filter((value) => value !== undefined);
}

레벨..레벨 2 도전 ~

    day.forEach((value) => {
        answer[value] = (answer[value] || 0) + 1;
    });
    
    return answer.filter((value) => value !== undefined);
}

아니 이 부분이 넘 [7,7,9] 있으면 그냥 숫자 갯수만 세면 되는건데... 

어케해야할지 몰라서 지피티한테 물어봤더니 일케 알려줬어요..ㅠㅠ

설명 들어들어 이해했으니 남겨놓겠습니다

 

  • value는 day 배열의 각 요소를 나타냅니다.
  • answer[value]는 value 값을 answer 배열의 인덱스로 사용합니다.
  • (answer[value] || 0)는 answer[value]가 존재하지 않거나, 값이 0 또는 falsy한 값이라면 0으로 초기화합니다.
  • + 1은 해당 인덱스 위치에 있는 값에 1을 더합니다. 이를 통해 value 값이 answer 배열에서 몇 번 등장하는지를 카운트하게 됩니다.

 

12월04일

올바른 괄호 - 스택

흠 너무 익숙한문제.. ㅎㅎ( 성공 못함 )

 

첫 번째 풀이

function solution(s){
    let arr_s = s.split();

    for (let i = 0; i < s.length; i++){
        if(s[0] !== "("){
            return false;
        } else if (s[i] == "(" && s[i + 1] == ")"){
            return true
        } else if (s[s.length - 1] == "("){
            return false;
        }
    }
}

알고리즘인데 이렇게 풀어도 되는진 모르겠으나.. 그리구 몇 개의 테스트 케이스를 통과하지 못했따.

이렇게 풀면 안됩니다!!!!!

 

제출 코드

function solution(s){
    const stack = [];
    
    for (let i = 0; i < s.length; i++){
        if (s[i] === '('){
            stack.push(s[i]);
        } else if (s[i] === ')'){
            if(stack.length === 0 || stack.pop() !== '('){
                return false;
            }
        }
    }
    return stack.length === 0 ? true : false;
}

 

스택 배열을 만들어서 s[i]가 ( 라면 stack에 넣고, i가 ) 면서 s[i]가 ) 라면 stack.pop으로 제거한다.
마지막에 스택의 길이가 0이라면 true를 반환, 아니라면 false를 반환한다 ㅎㅎ

 

 

12월06일

프로세스

문제가 정말 이해가 안되어요,, 설명 찾아보고 알았습니다 ㅜㅜ

솔직히 큐 알고리즘 풀어 본 적도 없고 그냥 max함수 써서 어떻게든 해보려고 했는데 도저히 답이 안나와서 답 봤어요.. ^^
알고 넘어가는게 중요하지 않을까요 ? (제발..)

function solution(priorities, location) {
    let queue = priorities.map((priority, idx) => ({ priority, idx }));
    let count = 0;

    while (queue.length > 0) {
        let current = queue.shift();
        if (queue.some(item => item.priority > current.priority)) {
            queue.push(current);
        } else {
            count++;
            if (current.index === location) {
                return count;
            }
        }
    }
}

먼저 priorities를 우선순위와 인덱스로 묶어서 queue라는 배열로 다시 생성해줍니다.

[{ priority: 2, idx: 0} , {priority: 1, idx: 1} ..... ] 이런 형태로 나와요

while문은 queue배열이 비어있지 않다면 계속 반복 실행됩니다 !

그리고 shift() 함수는 배열에서 첫 번째 요소를 제거하고 그 값을 반환해 주는데요, 변수 current에는 queue의 첫 번째 요소인 프로세스가 저장됩니다 (위 예시에서는 current가 { priority: 2, idx: 0 })

if문은 만약 현재 priority 객체 중에서 current보다 우선순위가 높은 것이 있다면 !!을 말하고 있고요, some()함수는 주어진 조건을 만족하는 요소가 배열 내에 하나라도 있는지를 확인합니다.