본문 바로가기
프로그래머스 코딩 테스트

프로그래머스 : JavaScript 알고리즘 100일 챌린지 37일차

by dongjin6539 2023. 6. 21.
728x90
반응형

프로그래머스 : JavaScript 알고리즘 100일 챌린지 37일차

 

코딩 기초 트레이닝 Day37

 

 

1. 리스트 자르기 : 정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러 개가 담긴 리스트 num_list가 주어집니다. slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.

  • n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
  • n = 2 : num_list의 a번 인덱스부터 마지막 인덱스까지
  • n = 3 : num_list의 a번 인덱스부터 b번 인덱스까지
  • n = 4 : num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로

올바르게 슬라이싱한 리스트를 return하도록 solution 함수를 완성해주세요.

function solution(my_string) {
    var answer = [];
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
n slicer num_list result
3 [1, 5, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 3, 4, 5, 6]
4 [1, 5, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 4, 6]

 

답 확인하기
function solution(n, slicer, num_list) {
    const [a, b, c] = slicer
    let result
    switch(n) {
        case 1: {
            result = num_list.slice(0, b+1)
            break
        }
        case 2: {
            result = num_list.slice(a, num_list.length)
            break
        }
        case 3: {
            result = num_list.slice(a, b+1)
            break
        }
        case 4: {
            const curStr = num_list.slice(a, b+1)
            result = curStr.filter((_, i) => i%c === 0 )
            break
        }
        default: {
            break
        }
    }
    
    return result
}

 

해설 확인하기

이 함수는 주어진 조건에 따라 배열 num_list를 잘라내어 새로운 배열을 반환하는 기능을 수행합니다. 함수의 동작을 자세히 설명하겠습니다.

n은 switch 문에서 사용될 변수로, 어떤 조건에 해당하는지를 결정합니다.

배열 slicer는 [a, b, c] 형태로 주어지며, 각각 잘라낼 구간을 나타냅니다.

let result 변수는 최종적으로 반환될 결과를 저장하기 위한 변수입니다.

switch 문을 사용하여 n에 따라 다른 동작을 수행합니다.

case 1 : num_list 배열의 0번째부터 b번째 인덱스까지의 요소들을 slice 메서드를 사용하여 잘라냅니다.

case 2 : num_list 배열의 a번째 인덱스부터 마지막 인덱스까지의 요소들을 slice 메서드를 사용하여 잘라냅니다.

case 3 : num_list 배열의 a번째 인덱스부터 b번째 인덱스까지의 요소들을 slice 메서드를 사용하여 잘라냅니다.

case 4 : num_list 배열의 a번째 인덱스부터 b번째 인덱스까지의 요소들을 slice 메서드를 사용하여 잘라냅니다. 그 후, filter 메서드를 사용하여 잘라낸 배열에서 인덱스 i가 c로 나누어 떨어지는 요소들만 필터링합니다.

result 변수에 결과를 저장하고 반환합니다.

따라서, 함수는 주어진 조건 n에 따라 num_list 배열을 잘라내어 새로운 배열로 반환합니다.

 

2. 첫 번째로 나오는 음수 : 정수 리스트 num_list가 주어질 때, 첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 음수가 없다면 -1을 return합니다.

function solution(n, k) {
    var answer = [];
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
num_list result
[12, 4, 15, 46, 38, -2, 15] 5
[13, 22, 53, 24, 15, 6] -1

 

답 확인하기
function solution(num_list) {
    return num_list.findIndex(a => a < 0)
}

 

해설 확인하기

이 함수는 주어진 배열 num_list에서 첫 번째로 음수인 요소의 인덱스를 찾아서 반환하는 기능을 수행합니다.

함수의 동작을 자세히 설명하겠습니다.

findIndex 메서드를 사용하여 배열 num_list에서 첫 번째로 주어진 조건을 만족하는 요소의 인덱스를 찾습니다.

콜백 함수 (a => a < 0)는 배열의 각 요소 a에 대해 실행됩니다. 여기서는 현재 요소가 음수인지를 확인하는 조건입니다.

만약 음수인 요소가 있다면 해당 요소의 인덱스가 반환됩니다. 배열에서 첫 번째로 음수인 요소의 인덱스가 반환되며, 함수는 종료됩니다.

음수인 요소가 없다면 findIndex 메서드는 -1을 반환합니다. 이는 배열에서 음수인 요소가 존재하지 않음을 나타냅니다.

결과적으로, 함수는 주어진 배열 num_list에서 첫 번째로 음수인 요소의 인덱스를 찾아서 반환하며, 음수인 요소가 없을 경우 -1을 반환합니다.

 

3. 배열 만들기3 : 정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어집니다. intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다. 이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.

function solution(my_string, indices) {
    var answer = '';
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
arr intervals result
[1, 2, 3, 4, 5] [[1, 3], [0, 4]] [2, 3, 4, 1, 2, 3, 4, 5]

 

답 확인하기
function solution(arr, intervals) {
    return intervals.reduce((acc, cur) => {
        const [from, to] = cur
        const curNums = arr.slice(from, to+1)
        return acc.concat(curNums)
    }, [])
}

 

해설 확인하기

이 함수는 주어진 배열 arr과 구간 배열 intervals을 사용하여, 각 구간에 해당하는 배열 요소들을 추출하여 하나의 배열로 합친 결과를 반환하는 기능을 수행합니다.

함수의 동작을 자세히 설명하겠습니다.

reduce 메서드를 사용하여 intervals 배열을 순회하면서 결과를 누적합니다. 초기값으로 빈 배열 []이 사용됩니다. reduce 메서드는 누적값 acc와 현재 요소 cur에 대해 콜백 함수를 실행합니다.

구조 분해 할당을 사용하여 현재 요소 cur을 [from, to]로 분해합니다. 이는 현재 구간의 시작 인덱스 from과 끝 인덱스 to를 나타냅니다.

slice(from, to+1)을 사용하여 arr 배열에서 from부터 to까지의 구간에 해당하는 배열 요소들을 추출합니다. slice 메서드는 시작 인덱스부터 끝 인덱스 이전까지의 요소들을 복사하여 새로운 배열을 반환합니다.

추출한 구간에 해당하는 배열 curNums를 누적값 acc에 합칩니다. concat 메서드를 사용하여 누적값 acc와 curNums 배열을 연결하여 새로운 배열을 생성합니다.

reduce 메서드가 순회를 완료하면, 모든 구간에 해당하는 배열 요소들이 하나의 배열로 합쳐진 결과가 반환됩니다.

결과적으로, 함수는 주어진 배열 arr과 구간 배열 intervals을 사용하여 각 구간에 해당하는 배열 요소들을 추출하여 하나의 배열로 합친 결과를 반환합니다.

 

4. 2의 영역 : 정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요. 단, arr에 2가 없는 경우 [-1]을 return 합니다.

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

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
arr result
[1, 2, 1, 4, 5, 2, 9] [2, 1, 4, 5, 2]
[1, 2, 1] [2]
[1, 1, 1] [-1]
[1, 2, 1, 2, 1, 10, 2, 1] [2, 1, 2, 1, 10, 2]
답 확인하기
function solution(arr) {
    const startIdx = arr.indexOf(2)
    const endIdx = arr.lastIndexOf(2)
    
    return startIdx+endIdx< 1 ? [-1] : arr.slice(startIdx, endIdx+1)
}

 

해설 확인하기

이 함수는 주어진 배열 arr에서 값이 2인 첫 번째 요소와 마지막 요소를 찾아 해당 구간을 추출하여 반환하는 기능을 수행합니다.

함수의 동작을 자세히 설명하겠습니다.

indexOf(2) 메서드를 사용하여 배열 arr에서 값이 2인 첫 번째 요소의 인덱스를 찾습니다. 해당 인덱스를 startIdx 변수에 저장합니다.

lastIndexOf(2) 메서드를 사용하여 배열 arr에서 값이 2인 마지막 요소의 인덱스를 찾습니다. 해당 인덱스를 endIdx 변수에 저장합니다.

startIdx + endIdx < 1을 사용하여 시작 인덱스와 마지막 인덱스의 합이 1보다 작은지 확인합니다. 이는 값이 2인 요소가 배열에 존재하지 않거나, 시작과 마지막 요소가 동일한 경우를 나타냅니다.

만약 startIdx + endIdx < 1 조건이 참이라면, 즉 값이 2인 요소가 배열에 존재하지 않거나 시작과 마지막 요소가 동일한 경우라면 [-1] 배열을 반환합니다. 이는 해당 조건을 만족하는 경우에는 유효한 구간이 없음을 나타냅니다.

그렇지 않은 경우, 즉 유효한 구간이 존재하는 경우는 slice(startIdx, endIdx+1)을 사용하여 arr 배열에서 시작 인덱스부터 마지막 인덱스까지의 구간을 추출합니다. slice 메서드는 시작 인덱스부터 끝 인덱스 이전까지의 요소들을 복사하여 새로운 배열을 반환합니다.

추출한 구간이 담긴 배열을 반환합니다.

결과적으로, 함수는 주어진 배열 arr에서 값이 2인 첫 번째 요소와 마지막 요소를 찾아 해당 구간을 추출하여 반환합니다. 만약 해당 구간이 유효하지 않을 경우 [-1] 배열을 반환합니다.

 

5. 배열 조각하기 : 정수 배열 arr와 query가 주어집니다. query를 순회하면서 다음 작업을 반복합니다.

  • 짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.
  • 홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.

위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.

function solution(arr, query) {
    var answer = [];
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
arr query result
[0, 1, 2, 3, 4, 5] [4, 1, 2] [1, 2, 3]

 

답 확인하기
function solution(arr, query) {
    for(let i = 0 ; i < query.length ; i ++) {
        const cur = query[i]
        
        if(i%2 === 0) {
            arr.splice(cur+1, arr.length -(cur+1))
        } else {
             arr.splice(0, cur)
        }
    }
    
    return arr
}

 

해설 확인하기

이 함수는 주어진 배열 arr에 대해 주어진 쿼리 배열 query에 따라 배열을 수정하고, 최종적으로 수정된 배열을 반환하는 기능을 수행합니다.

함수의 동작을 자세히 설명하겠습니다.

for 루프를 사용하여 query 배열을 순회합니다. 변수 i는 루프의 반복 횟수를 나타냅니다.

각 반복에서 현재 쿼리를 변수 cur에 저장합니다.

if 문을 사용하여 현재 쿼리의 인덱스 i가 짝수인지 홀수인지를 확인합니다. 즉, i를 2로 나눈 나머지가 0인지 확인합니다.

짝수인 경우(i%2 === 0), 배열 arr에서 cur+1 인덱스부터 마지막 인덱스까지의 요소들을 제거합니다. splice 메서드를 사용하여 배열의 내용을 변경합니다. splice(start, deleteCount)는 start 인덱스부터 deleteCount만큼의 요소를 제거합니다.

홀수인 경우(i%2 !== 0), 배열 arr에서 0부터 cur 인덱스까지의 요소들을 제거합니다.

for 루프가 모든 쿼리를 순회하면, 배열 arr의 최종 상태가 반환됩니다.

결과적으로, 함수는 주어진 배열 arr에 대해 쿼리 배열 query에 따라 배열을 수정하고, 최종적으로 수정된 배열을 반환합니다.

728x90
반응형