Front-End

프로그래머스 기초트레이닝 10일차 본문

알고리즘

프로그래머스 기초트레이닝 10일차

jeongsso 2023. 8. 22. 20:44

흐어 .. 주말에 강아지가 또 아프고,

저는 저대로 가족모임이 있고 해서 바빴습니다..

늦었지만 다시 시작!

 

 

문제 47.  두 수의 차


문제 설명

정수 num1과 num2가 주어질 때,

num1에서 num2를 뺀 값을 return하도록 soltuion 함수를 완성해주세요.

 

 

입출력 예

num1 num2 result
2 3 -1
100 2 98

 

 

입출력 예 설명

num1이 2이고 num2가 3이므로 2 - 3 = -1을 return합니다.

num1이 100이고 num2가 2이므로 100 - 2 = 98을 return합니다.

 

저의 풀이!

 
function solution(num1, num2) {
    return num1 - num2;
}

console.log(solution(2, 3));

 

메모

허허이.. 너무 쉽죠 ?

 

 

 

 

문제 48.  뒤에서 5등 위로


문제 설명

정수로 이루어진 리스트 num_list가 주어집니다.

num_list에서 가장 작은 5개의 수를 제외한 수들을 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

 

입출력 예

num_list result
[12, 4, 15, 46, 38, 1, 14, 56, 32, 10] [15, 32, 38, 46, 56]

 

 

입출력 예 설명

[12, 4, 15, 46, 38, 1, 14, 56, 32, 10]를 정렬하면 [1, 4, 10, 12, 14, 15, 32, 38, 46, 56]이 되고, 앞에서 부터 6번째 이후의 수들을 고르면 [15, 32, 38, 46, 56]가 됩니다.

 

 

저의 풀이!

 
function solution(num_list) {
    return num_list.sort((a, b) => a - b).slice(5);
}

console.log(solution([12, 4, 15, 46, 38, 1, 14, 56, 32, 10]));

 

 

메모

slice 는 인덱스로 계산한다.
5개의 수를 제외한, 이라고 했으니까
인덱스 4까지는 포함하면 안되는거다.
slice 의 인자는 그 인덱스까지 포함이기 때문에 그 이후의 숫자를 입력해줘야한다.

정렬함수 sort 는 오류가 있다.
문자열로 인식하고 정렬해서 100, 2, 30 이 있으면 2, 30 , 100 으로 되야하는데
sort 는 100,2, 30 으로 정렬한다.

숫자를 기준으로 할 때는 람다 함수를 넣어서

(a,b) => a-b로
음수가 리턴된다면 a < b를 의미하고,
양수가 리턴된다면 a > b를 의미하고,
0이 리턴된다면 a == b를 의미한다.
정렬을 위해 두 값을 비교하는 기준을 정의하여 sort()함수의 매개변수로 넘겨주는 것이다.

숫자랑 문자열을 함께 넣을 경우는 되지않으니 조건문을 써야한다.
문자열(유니코드)끼리는 >, < 연산은 가능하지만 - 연산은 불가능하기 때문에 제대로 된 비교가 이루어지지 않은 것!
따라서 아래 코드와 같이 >, <, ===를 이용한 람다 함수를 넘겨줘야 한다.

let sortedArray = array.sort((a, b) => {
  if(a < b) return -1;
  if(a > b) return 1;
  if(a === b) return 0;
  else return -1;

})

 

 

 

 

 

 

문제 49.  글자를 이어 붙여 문자열 만들기


문제 설명

문자열 my_string과 정수 배열 index_list가 매개변수로 주어집니다.

my_string의 index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는

solution 함수를 작성해 주세요.


 

입출력 예

my_string index_list result
"cvsgiorszzzmrpaqpe" [16, 6, 5, 3, 12, 14, 11, 11, 17, 12, 7] "programmers"
"zpiaz" [1, 2, 0, 0, 3] "pizza"

 

 

 

입출력 예 설명

예제 1번의 my_string에서 인덱스 3, 5, 6, 11, 12, 14, 16, 17에 해당하는 글자는 각각 g, o, r, m, r, a, p, e이므로 my_string에서 index_list에 들어있는 원소에 해당하는 인덱스의 글자들은 각각 순서대로 p, r, o, g, r, a, m, m, e, r, s입니다. 따라서 "programmers"를 return 합니다.

예제 2번의 my_string에서 인덱스 0, 1, 2, 3에 해당하는 글자는 각각 z, p, i, a이므로 my_string에서 index_list에 들어있는 원소에 해당하는 인덱스의 글자들은 각각 순서대로 p, i, z, z, a입니다. 따라서 "pizza"를 return 합니다.

 

 

저의 풀이!

function solution(my_string, index_list) {
    let answer = '';

    for (let i = 0; i < index_list.length; i++) {
        answer += my_string[index_list[i]];
    }

    return answer;
}

console.log(
solution('cvsgiorszzzmrpaqpe', [16, 6, 5, 3, 12, 14, 11, 11, 17, 12, 7])
);

 

 

 

메모

반복문을 사용하여 새로운 문자열을 만들어주었습니다.

 

근데 map으로도 가능합니다! 

return index_list.map(a => my_string[a]).join('');

이런 식으로도 사용할 수 있으니 보십셔!

 

 

 

문제 50.  부분 문자열


문제 설명

문자 "A"와 "B"로 이루어진 문자열 myString과 pat가 주어집니다. 

myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 

아니면 0을 return 하는 solution 함수를 완성하세요.

 

입출력 예

myString pat result
"ABBAA" "AABB" 1
"ABAB" "ABAB" 0

 

입출력 예 설명

"ABBAA"에서 "A"와 "B"를 서로 바꾸면 "BAABB"입니다. 여기에는 부분문자열 "AABB"가 있기 때문에 1을 return 합니다.

"ABAB"에서 "A"와 "B"를 서로 바꾸면 "BABA"입니다. 여기에는 부분문자열 "BABA"가 없기 때문에 0을 return 합니다.

 

 

 

저의 풀이!

function solution(my_string, pat) {
    let answer = '';

    for (let i = 0; i < my_string.length; i++) {
        answer += my_string[i] === 'A' ? 'B' : 'A';
    }

    return +answer.includes(pat);
}

console.log(solution('ABBAA', 'AABB'));

 

 

메모

이거는 반복문 이해랑 삼항연산자 또는 조건문을 이용하면 쉬운 문제였습니다!

 

 

 

 

 

 

문제 51.  원하는 문자열 찾기


문제 설명

알파벳으로 이루어진 문자열 myString과 pat이 주어집니다. 

myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0을 return 하는 solution 함수를 완성해 주세요.

단, 알파벳 대문자와 소문자는 구분하지 않습니다.

 

 

입출력 예

myString pat return
"AbCdEfG" "aBc" 1
"aaAA" "aaaaa" 0

 

 

 

입출력 예 설명

"AbCdEfG"의 0~2번 인덱스의 문자열은 "AbC"이며, 이는 pat인 "aBc"와 같습니다. 따라서 1을 return 합니다.

myString의 길이가 pat보다 더 짧기 때문에 myString의 부분 문자열 중 pat와 같은 문자열이 있을 수 없습니다. 따라서 0을 return 합니다.

 

 

저의 풀이!

 
function solution(my_string, pat) {
    let 동일하게변경1 = my_string.toUpperCase();
    let 동일하게변경2 = pat.toUpperCase();

    return +동일하게변경1.includes(동일하게변경2);
}

console.log(solution('AbCdEfG', 'aBc'));

 

메모

이것도 매우 간단했습니당.

일단 '대소문자 구분하지 않습니다.' 여기서 빠르게! 

그러면 동일하게 전부 변경해서 확인하면 편하겠다라는 생각을 하고 두 인자 다 대문자로 변경한 후에

includes 함수를 사용했습니다~

 

return 바로뒤에 + 표시는 number 로 boolean값을 표현해달라고 자동형변환을 해둔겁니다!

 

 

 

 

 

문제 52.  배열 만들기


문제 설명

정수 n과 k가 주어졌을 때,

1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.



 

입출력 예

n k result
10 3 [3, 6, 9]
15 5 [5, 10, 15]

 

 

 

입출력 예 설명

1 이상 10 이하의 3의 배수는 3, 6, 9 이므로 [3, 6, 9]를 return 합니다.

1 이상 15 이하의 5의 배수는 5, 10, 15 이므로 [5, 10, 15]를 return 합니다.

 

 

저의 풀이!

 
function solution(n, k) {
    let answer = [];

    for (let i = 1; i <= n; i++) {
        if (i % k === 0) {
            answer.push(i);
        }
    }

    return answer;
}

console.log(solution(10, 3));

 

메모

n이하의 정수라고 해서 반복문 조건에 넣었습니다.

그리고 배수를 오름차순으로 저장해달라하여 나머지를 이용해서 풀었습니당

 

 

 

 

 

문제 53.  마지막 두원소


문제 설명

정수 리스트 num_list가 주어질 때,

마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을

마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.

 

 

입출력 예

num_list result
[2, 1, 6] [2, 1, 6, 5]
[5, 2, 1, 7, 5] [5, 2, 1, 7, 5, 10]

 

 

 

입출력 예 설명

마지막 원소인 6이 그전 원소인 1보다 크기 때문에 6 - 1인 5를 추가해 return합니다.

마지막 원소인 5가 그전 원소인 7보다 크지 않기 때문에 5의 두 배인 10을 추가해 return합니다.

 

저의 풀이!

function solution(num_list) {
    let 마지막원소 = num_list[num_list.length - 1];
    let 그전원소 = num_list[num_list.length - 2];

   if (마지막원소 > 그전원소) {
       num_list.push(마지막원소 - 그전원소);
   } else num_list.push(마지막원소 * 2);

   return num_list;

// return 마지막원소 > 그전원소
// ? num_list.push(마지막원소 - 그전원소)
// : num_list.push(마지막원소 * 2);
}

console.log(solution([2, 1, 6]));

 

 

메모

const [ a, b ] = [...num_list]
이건 찾아보고 공부해서 적용해보자...!!

 

function solution1(num_list) {
    const [a, b] = [...num_list].reverse();
   
    return [...num_list, a > b ? a - b : a * 2];
}

console.log(solution1([2, 1, 6]));

wow.....

생각도 못한 풀이입니다 ..

const [a,b] = [...num_list]  이거 자체가 num_list 배열의 1, 2 번 요소를 a,b 로 선언하고

그걸 reverse() 뒤집어서하면 맨뒤에거가 a고 맨뒤에서 앞에거가 b가되는 ...

 

그렇게해서 배열안에 num_list들과 뒤에 하나 추가하는 방식으로 .. .생각도 못했습니다.

Comments