Front-End

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

알고리즘

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

jeongsso 2023. 10. 4. 04:54

가족이랑 해외여행을 갔다오느라, 포스팅이 늦었습니다.

빠르게 다시 공부해서 올리도록 하겠습니다!

 

 

문제 84.  날짜 비교하기


문제 설명

정수 배열 date1과 date2가 주어집니다. 
두 배열은 각각 날짜를 나타내며 [year, month, day] 꼴로 주어집니다. 
각 배열에서 year는 연도를, month는 월을, day는 날짜를 나타냅니다.

만약 date1이 date2보다 앞서는 날짜라면 1을, 아니면 0을 return 하는 solution 함수를 완성해 주세요.

 

 

입출력 예

date1 date2 result
[2021, 12, 28] [2021, 12, 29] 1
[1024, 10, 24] [1024, 10, 24] 0

 

입출력 예 설명

date1이 date2보다 하루 앞서기 때문에 1을 return 합니다.

date1과 date2는 날짜가 서로 같으므로 date1이 더 앞서는 날짜가 아닙니다. 따라서 0을 return 합니다.

 

 

저의 풀이!

function solution(date1, date2) {
    let dateOne = new Date(date1);
    let dateTwo = new Date(date2);

    return dateOne < dateTwo ? 1 : 0;
}

console.log(solution([2021, 12, 28], [2021, 12, 29]));

 

 

메모

new Date 인자에 배열로된 날짜를 넣어도 인식해서 날짜형식으로 읽어준다.

그래서 따로 년 월 일을 나눠서 올려두지 않아도 저대로 바로 넣어도 날짜를 확인할 수 있다.

 

 

 

 

문제 85.  이차원 배열 대각선 순회하기


문제 설명

2차원 정수 배열 board와 정수 k가 주어집니다.
i + j <= k를 만족하는 모든 (i, j)에 대한 board[i][j]의 합을 return 하는 solution 함수를 완성해 주세요.

 

입출력 예

board k result
[[0, 1, 2],[1, 2, 3],[2, 3, 4],[3, 4, 5]] 2 8

 

입출력 예 설명

 

 

저의 풀이!

function solution(board, k) {
    let answer = 0;

    for (let i = 0; i < board.length; i++) {
        for (let j = 0; j < board[0].length; j++) {
            if (i + j <= k) {
                answer += board[i][j];
            }
        }
    }
    return answer;
}

console.log(
    solution(
    [
        [0, 1, 2],
        [1, 2, 3],
        [2, 3, 4],
        [3, 4, 5],
    ],
    2
)
);

 

 

메모

이차원배열을 순회하기 위해 이중 반복문, 즉 2중 for문을 사용해서 문제를 풀었습니다.

 

 

 

 

 

문제 86.  수열과 구간 쿼리 1


문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 arr[i]에 1을 더합니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

입출력 예

arr queries result
[0, 1, 2, 3, 4] [[0, 1],[1, 2],[2, 3]] [1, 3, 4, 4, 4]

 

입출력 예 설명

 

 

저의 풀이!

function solution(arr, queries) {
    let 복사본 = [...arr];

    for (let i = 0; i < queries.length; i++) {
        const [s, e] = queries[i];
        for (let j = s; j <= e; j++) {
            복사본[j] += 1;
        }
    }
    return 복사본;
}

console.log(
    solution(
        [0, 1, 2, 3, 4],
        [
            [0, 1],
            [1, 2],
            [2, 3],
        ]
    )
);

 

 

메모

구조분해 할당을 이용해서 queries를 변수에 담았고, 이중 반복문을 이용해서 queries의 이중배열을 순회했습니다.

원본 배열을 수정하기 보다 복사본의 배열을 만들어서 식을 성립한 후 출력되도록 코드를 작성했습니다.

 

 

 

 

문제 87.  빈 배열에 추가, 삭제하기


문제 설명

아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 
길이가 같은 정수 배열 arr과 boolean 배열 flag가 매개변수로 주어질 때,
flag를 차례대로 순회하며 flag[i]가 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고,
flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.



입출력 예

arr flag result
[3, 2, 4, 1, 3] [true, false, true, false, false] [3, 3, 3, 3, 4, 4, 4, 4]

 

입출력 예 설명

 

 

저의 풀이!

function solution(arr, flag) {
    let 빈배열 = [];
 
    for (let i = 0; i < arr.length; i++) {
        for (let j = 0; j < arr[i] * 2; j++) {
            if (flag[i]) 빈배열.push(arr[i]);
        }
        if (!flag[i]) {
            빈배열.splice(빈배열.length - arr[i]);
        }
    }
    return 빈배열;
}

console.log(solution([3, 2, 4, 1, 3], [true, false, true, false, false]));

 

 

메모

여기서 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고, 이 부분 때문에 반복문 조건에 * 2를 적어두었습니다.

그렇게 해야 추가되는 횟수를 2배할 수 있다고 생각하고 작성했습니다.

 

그리고 flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는, 이 부분 때문에 이중 반복문을 벗어난 

하나의 반복문 안에서만 따로 빈배열일 경우 맨 뒤 쪽을 잘라내도록 splice 함수를 사용했습니다.

 

 

 

 

 

문제 88.  배열 만들기


문제 설명

문자열 배열 intStrs와 정수 k, s, l가 주어집니다. intStrs의 원소는 숫자로 이루어져 있습니다.
배열 intStrs의 각 원소마다 s번 인덱스에서 시작하는 길이 l짜리 부분 문자열을 잘라내 정수로 변환합니다.
이때 변환한 정수값이 k보다 큰 값들을 담은 배열을 return 하는 solution 함수를 완성해 주세요.

 

입출력 예

intStrs k s i result
["0123456789","9876543210","9999999999999"] 50000 5 5 [56789, 99999]

 

 

입출력 예 설명

 

저의 풀이!

function solution(intStrs, k, s, l) {
    let arr = [];
    for (let i = 0; i < intStrs.length; i++) {
        if (k < +intStrs[i].slice(s, s + l)) {
            arr.push(+intStrs[i].slice(s, s + l));
        }
    }
    return arr;
}

console.log(
    solution(['0123456789', '9876543210', '9999999999999'], 50000, 5, 5)
);

 

 

메모

일단 문자열을 잘라낸 것을 숫자로 변환한 후 k 보다 큰지 작은지 확인하는 조건문을 만든 다음 

빈 배열의 변수를 만들어서 그곳에 담기게 식을 작성했습니다.

 

filter로도 풀수 있다고해서 풀어봤습니다. 

일단 문자열을 자르는 부분은 map으로 문자열을 자른 후 숫자로 변환한 새로운 배열을 만들고, 그걸 filter로 돌렸습니다.

function solution1(intStrs, k, s, l) {
    return intStrs.map(item => +item.substring(s, s + l)).filter(v => v > k);
}

console.log(
    solution1(['0123456789', '9876543210', '9999999999999'], 50000, 5, 5)
);

 

 

 

 

문제 89.  글자 지우기


문제 설명

문자열 my_string과 정수 배열 indices가 주어질 때, 
my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

 

입출력 예

my_string indices result
"apporoograpemmemprs" [1, 16, 6, 15, 0, 10, 11, 3] "programmers"

 

 

입출력 예 설명

 

 

저의 풀이!

function solution(my_string, indices) {
    return [...my_string].filter((_, i) => !indices.includes(i)).join('');
}

console.log(solution('apporoograpemmemprs', [1, 16, 6, 15, 0, 10, 11, 3]));

 

 

메모

저는 일단 my_string을 배열로 변환한 후 filter 를 사용해서 포함되지않은 인덱스의 i 만 빼서 배열을 만든 후 join으로 합쳤습니다.

 

하지만 굳이 join을 쓰지않고도 반복문으로 풀 수 있을 것이라고 해서 풀어봤습니다.

function solution1(my_string, indices) {
    let answer = '';

    for (let i = 0; i < my_string.length; i++) {
        if (!indices.includes(i)) {
            answer += my_string[i];
        }
    }
    return answer;
}

console.log(solution1('apporoograpemmemprs', [1, 16, 6, 15, 0, 10, 11, 3]));

오호~~

 

 

 

 

문제 90.  문자열 뒤집기


문제 설명

문자열 my_string과 정수 s, e가 매개변수로 주어질 때, 
my_string에서 인덱스 s부터 인덱스 e까지를 뒤집은 문자열을 return 하는 solution 함수를 작성해 주세요.

 

입출력 예

my_string s e result
"Progra21Sremm3" 6 12 "ProgrammerS123"
"Stanley1yelnatS" 4 10 "Stanley1yelnatS"

 

입출력 예 설명

예제 1번의 my_string에서 인덱스 6부터 인덱스 12까지를 뒤집은 문자열은 "ProgrammerS123"이므로 "ProgrammerS123"를 return 합니다.

예제 2번의 my_string에서 인덱스 4부터 인덱스 10까지를 뒤집으면 원래 문자열과 같은 "Stanley1yelnatS"이므로 "Stanley1yelnatS"를 return 합니다.

 

 

저의 풀이!

function solution(my_string, s, e) {
    let 자른거 = [...my_string]
        .slice(s, e + 1)
        .reverse()
        .join('');

    return my_string.replace(my_string.slice(s, e + 1), 자른거);
}

console.log(solution('Progra21Sremm3', 6, 12));

 

 

메모

일단 배열로 변경 한 후 slice로 뒤집어야하는 부분을 뒤집고 join으로 글자로 다시 변경해두고 변수에 담아뒀습니다.

그리고 replace로 글자를 변경했습니다.

 

 

Comments