고양이와 코딩

[프로그래머스] 11월29일 ~ 12월03일 본문

javascript

[프로그래머스] 11월29일 ~ 12월03일

ovovvvvv 2023. 11. 29. 14:56
728x90

11월 29일

2의 영역

문제를 이해할때 주의해야 하는데, 가장 작은 연속된에 집중하지 말고 "배열 안의 2가 모두 포함된" 에 집중해야한다 !
결국 arr배열에서 2부터 2까지를 반환하는것.

 

내 풀이

function solution(arr) {
    let startNum = arr.indexOf(2);
    let endNum = arr.lastIndexOf(2);

    if(arr[startNum] !== 2 || arr[endNum] !== 2){
        return [-1];
    }
    
    return arr.slice(startNum, endNum + 1);
}

indexOf, lastIndexOf 메서드를 사용해서 처음에 나오는 2와 마지막에 나오는 2를 찾았다. 
찾으면 slice로 배열을 반환하고, 2가 없으면 -1을 return 해준다.

여기 if문에서 startNum !== 2 이런식으로 비교하면 안된다 ㅎㅎ
배열 안의 요소와 비교해줄라면 arr[startNum] !== 2 로 감싸줘야댐... gpt한테 무러봤다..

 

 

배열 조각하기

 

처음 코드

function solution(arr, query) {
    var answer = [];
    
    for (let i = 0; i < query.length; i++){
        if(query[i] % 2 == 0){
              arr = arr.slice(0, query[i] + 1);   
        } else if(query[i] % 2 !== 0){
            arr = arr.slice(query[i], arr.length);
        }
    }
    
    return arr;
}

첫 테스트 케이스만 성공하고.. 제출했더니 다틀림..

 

제출 코드

function solution(arr, query) {
    var answer = [];
    
    for (let i = 0; i < query.length; i++){
        if(i % 2 == 0){
              arr = arr.slice(0, query[i] + 1);   
        } else if(i % 2 !== 0){
            arr = arr.slice(query[i], arr.length);
        }
    }
    
    return arr;
}

하 문제 이해하는데 개오래걸렸다.... ㅜㅜ 그니까 이게 짝수 홀수가 query의 값을 말하는게 아니라 쿼리의 인덱스 값을 말하는거였음...
그렇다고 말을 해주지 진짜 0, 1, 2, 3 이게 홀수일때, 짝수일때로 풀면 되는거였음니다.. ㅎㅎ

 

 

n번째 원소부터

 

내 풀이

function solution(num_list, n) {
    return num_list.slice(n-1, num_list.length);
}

 

 

11월30일

순서 바꾸기

 

내 풀이

function solution(num_list, n) {
    let n_after = num_list.slice(n, num_list.length);
    let n_before = num_list.slice(0, n);
    
    return Array.from(n_after).concat(n_before);
}

Array.from 메서드 익히기,, concat도 까먹지 말기..

 

왼쪽 오른쪽

 

내 풀이

function solution(str_list) {
    let answer = [];

    for (let i = 0; i < str_list.length; i++) {
        if (str_list[i] === 'l') {
            answer = str_list.slice(0, i); 
            break; 
        } else if (str_list[i] === 'r') {
            answer = str_list.slice(i + 1);
            break;
        }
    }

    return answer;
}

 

 

n 번째 원소까지

 

내 풀이

function solution(num_list, n) {
    return num_list.slice(0, n);
}

 

 

n개 간격의 원소들

 

내 풀이

function solution(num_list, n) {
    var answer = [];
    
    for (let i = 0; i < num_list.length; i += n){
        answer.push(num_list[i]);
    }
    return answer;
}

 

 

12월01일

홀수VS짝수

 

내 풀이

function solution(num_list) {
    let evenSum = 0;
    let oddSum = 0;
    
    num_list.forEach((value, index) => {
        if((index + 1) % 2 !== 0){
            oddSum += value;
        } else if ((index + 1) % 2 === 0){
            evenSum += value;
        }
    })
    return Math.max(evenSum, oddSum) ;
}

더 간단하게 풀 수 있을 것 같아서 다른 사람들의 풀이를 찾아보았따

 

function solution(num_list) {
    let odd = 0;
    let even = 0;

    num_list.forEach((x,i) => i%2 == 0 ? even += x : odd += x);


    return Math.max(odd, even);
}

 

5명씩

 

 

 

 

내 풀이

function solution(names) {
    var answer = [];
    
    for (let i = 0; i < names.length; i += 5){
        answer.push(names[i]);
    }
    return answer;
}

 

 

할 일 목록

 

내 풀이

function solution(todo_list, finished) {
    var answer = [];
    
    for (let i = 0; i < finished.length; i++){
        if(finished[i] === false){
            answer.push(todo_list[i]);
        }
    }
    return answer;
}

 

 

n보다 커질 때까지 더하기

 

내 풀이

function solution(numbers, n) {
    var answer = 0;
   
    for (let i = 0; i <numbers.length; i++){
        answer += numbers[i];
        if (answer > n){
            break;
        }
    }
    return answer;
}

 

다른 사람의 풀이

function solution(numbers, n) {
    var answer = 0;
    let i = 0;
    while(answer <= n) {
        answer += numbers[i++]
    }
    return answer;
}

이렇게도 할 수 있군여

 

 

수열과 구간 쿼리1

 

내 풀이

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

    for (let i = 0; i < queries.length; i++) {
        const [s, e] = queries[i];

        for (let j = s; j <= e; j++) {
            arr[j]++;
        }
    }

    return arr;
}

 

 

12월02일

조건에 맞게 수열 변환하기 1

 

내 풀이

function solution(arr) {
    var answer = [];
    
    arr.forEach((value) => {
        if(value >= 50 && value % 2 === 0){
            answer.push(value / 2);
        } else if(value < 50 && value % 2 !== 0){
            answer.push(value * 2);
        } else {
            answer.push(value);
        }
    })
    return answer;
}

짝수이면서 50보다 작은 경우도 생각해줍시다

 

 

조건에 맞게 수열 변환하기 2

위에서 풀었던 문제에 조건이 더 추가된 문제

 

내 풀이

function solution(arr) {
    let x = 0;

    while (true) {
        let temp = [];

        for (let i = 0; i < arr.length; i++) {
            if (arr[i] >= 50 && arr[i] % 2 === 0) {
                temp.push(arr[i] / 2);
            } else if (arr[i] < 50 && arr[i] % 2 !== 0) {
                temp.push((arr[i] * 2) + 1);
            } else {
                temp.push(arr[i]);
            }
        }

        let isEqual = true;
        for (let i = 0; i < arr.length; i++) {
            if (arr[i] !== temp[i]) {
                isEqual = false;
                break;
            }
        }
        if (isEqual) {
            return x; 
        }
        arr = temp; 
        x++;
    }
}

코드가 너저분하지만.. ^^ 의외로 보기는 간단하다

위에서 사용했던 for문을 while문 무한루프로 감싸주고 그 안에서 arr[i](현재 arr배열)과 temp[i](저장해놓은 이전 배열) 의 요소들이
같은지 판별하고 다르면 반복문을 끝내고, 같으면 x를 반환한다 !

 

 

1로 만들기

 

내 풀이

function solution(num_list) {
    let count = 0;

    for (let num of num_list) {
        while (num !== 1) {
            if (num % 2 === 0) {
                num /= 2;
            } else {
                num = (num - 1) / 2;
            }
            count++;
        }
    }

    return count;
}

num_list 배열을 순회하면서 while문으로 num이 1이 아닐 경우에 반복하며 count를 증가시킨다

 

 

길이에 따른 연산

 

내 풀이

function solution(num_list) {
    
  if (num_list.length >= 11) {
    const sum = num_list.reduce((acc, num) => acc + num, 0);
      return sum;
} else if (num_list.length <= 10){
    const mul = num_list.reduce((acc, num) => acc * num, 1);
    return mul;
}
}

 

 

 

12월03일

원하는 문자열 찾기

 

내 풀이

function solution(myString, pat) {
    const myString2 = myString.toLowerCase();
    const pat2 = pat.toLowerCase();
    return myString2.includes(pat2) ? 1 : 0;
}

 

 

대문자로 바꾸기

 

내 풀이

function solution(myString) {
    return myString.toUpperCase();
}

 

 

배열에서 문자열 대소문자 변환하기

 

내 풀이

function solution(strArr) {
    const newArr = strArr.map((value, index) => {
        if(index % 2 !== 0){
            return value.toUpperCase();
        } else {
            return value.toLowerCase();
        }
    })
    return newArr;
}

 

 

A 강조하기

 

내 풀이

function solution(myString) {
    const strArr = myString.split('');
    
    const newStr = strArr.map((value, index) => {
        if( value === 'a'){
            return 'A';
        } else if( value > 'A' && value <= 'Z') {
            return value.toLowerCase();
        } else {
            return value;
        }
        })
    return newStr.join('');
}

 

 

특정한 문자를 대문자로 바꾸기

 

내 풀이

function solution(my_string, alp) {
    const arrStr = my_string.split('');
    
    newArr = arrStr.map((value, index) => {
        if (value == alp){
            return value.toUpperCase();
        } else {
            return value;
        }
    })
    return newArr.join('');
}