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

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

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

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

 

코딩 기초 트레이닝 Day36

 

 

1. 문자 개수 세기 : 알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때, my_string에서 'A'의 개수, my_string에서 'B'의 개수,..., my_string에서 'Z'의 개수, my_string에서 'a'의 개수, my_string에서 'b'의 개수,..., my_string에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 return 하는 solution 함수를 작성해 주세요.

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

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
my_string result
"Programmers" [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0]

 

답 확인하기
function solution(my_string) {
    const arr = Array(52).fill(0)
    return [...my_string].reduce((acc, cur) => {
        let curIdx
        const curAlpha= cur.charCodeAt()
        if(curAlpha >= 97) {
         curIdx = curAlpha - 71   
        } else {
         curIdx = curAlpha-65   
        }
         
        acc[curIdx] = acc[curIdx] ?? 0
        acc[curIdx]++
        return acc
    }, arr)
}

 

해설 확인하기

이 함수는 주어진 문자열 my_string의 각 문자의 출현 빈도를 계산하는 기능을 가지고 있습니다.

함수는 먼저 길이가 52인 배열 arr을 생성하고 모든 요소를 0으로 초기화합니다. 이 배열은 알파벳 대문자와 소문자의 각각의 출현 빈도를 저장하는 역할을 합니다.

[...my_string] 구문은 my_string 문자열을 배열로 변환하는 역할을 합니다. 그리고 reduce 함수를 사용하여 배열의 각 요소에 대해 반복 작업을 수행합니다.

각 문자에 대해 다음 작업이 수행됩니다:

  1. cur.charCodeAt()를 사용하여 현재 문자 cur의 유니코드 값을 얻습니다.
  2. curAlpha가 97보다 크거나 같으면 현재 문자가 소문자이므로 curIdx를 curAlpha - 71로 설정합니다. 소문자의 경우 a의 유니코드 값은 97이므로 a를 인덱스 0에 매핑하기 위해 26을 뺍니다.
  3. 그렇지 않으면 현재 문자는 대문자이므로 curIdx를 curAlpha - 65로 설정합니다. 대문자의 경우 A의 유니코드 값은 65이므로 A를 인덱스 0에 매핑하기 위해 26을 뺍니다.
  4. acc[curIdx] = acc[curIdx] ?? 0을 사용하여 acc[curIdx] 값이 존재하지 않으면 0으로 초기화합니다.
  5. acc[curIdx]++을 통해 현재 문자의 출현 빈도를 증가시킵니다.
  6. 최종적으로 갱신된 acc 배열을 반환합니다.

결과적으로 함수는 my_string에 포함된 각 문자의 출현 빈도를 나타내는 배열을 반환합니다. 이 배열은 대문자 A부터 Z까지의 빈도를 인덱스 0부터 25까지 저장하고, 소문자 a부터 z까지의 빈도를 인덱스 26부터 51까지 저장합니다.

 

2. 배열 만들기1 : 정수 n과 k가 주어졌을 때, 1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

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

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
n k result
10 3 [3, 6, 9]
15 5 [5, 10, 15]

 

답 확인하기
function solution(n, k) {
    const result = []
    
    Array(n).fill(0).forEach((a, i) => {
        if((i+1) % k === 0) result.push(i+1)
    })
    
    return result
}

// fill : 배열의 시작 인덱스부터 끝 인덱스의 이전까지 정적인 값 하나로 채웁니다.

 

해설 확인하기

이 함수는 주어진 두 개의 매개변수 n과 k를 사용하여 1부터 n까지의 수 중에서 k의 배수인 수들을 찾아 배열로 반환하는 기능을 수행합니다.

먼저, 빈 배열 result를 선언합니다. 이 배열은 k의 배수인 수들을 저장하기 위한 배열입니다.

Array(n)은 길이가 n인 새로운 배열을 생성합니다. fill(0)을 호출하여 해당 배열의 모든 요소를 0으로 채웁니다. 이는 초기값이 0인 배열을 생성하는 역할을 합니다.

forEach 메서드를 사용하여 배열의 각 요소에 대해 반복 작업을 수행합니다.

forEach 메서드는 배열의 요소와 해당 요소의 인덱스를 매개변수로 받습니다.

반복 작업에서는 (i+1) % k === 0 조건을 사용하여 현재 인덱스 i에 1을 더한 값이 k로 나누어 떨어지는지 확인합니다. 이는 k의 배수인지를 검사하는 조건입니다.

만약 (i+1) % k === 0 조건이 참이라면, result 배열에 i+1 값을 추가합니다. 여기서 i+1은 1부터 n까지의 수를 의미하므로, k의 배수인 경우에만 result 배열에 추가됩니다.

모든 반복이 완료된 후, result 배열을 반환합니다. 이 배열에는 1부터 n까지의 수 중에서 k의 배수인 수들이 저장되어 있습니다.

 

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

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

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
my_string indices result
"apporoograpemmemprs" [1, 16, 6, 15, 0, 10, 11, 3] "programmers"

 

답 확인하기
function solution(my_string, indices) {
    return [...my_string].map((a, i) => indices.includes(i) ? 0 : a).filter(a => a !== 0).join("")
}

// filter : 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.
// includes : 배열이 특정 요소를 포함하고 있는지 판별합니다.

 

해설 확인하기

이 함수는 주어진 문자열 my_string과 인덱스 배열 indices를 사용하여 문자열에서 특정 인덱스에 해당하는 문자들을 필터링하고 제외하는 기능을 수행합니다.

함수의 동작을 자세히 살펴보겠습니다.

문자열 my_string을 배열로 변환하기 위해 [...my_string] 구문을 사용합니다. 이를 통해 문자열의 각 문자가 배열의 요소로 분리됩니다.

map 메서드를 사용하여 배열의 각 요소에 대해 반복 작업을 수행합니다. map 메서드는 콜백 함수를 적용한 새로운 배열을 생성합니다.

콜백 함수 (a, i) => indices.includes(i) ? 0 : a에서는 각 요소 a와 해당 요소의 인덱스 i를 매개변수로 받습니다. indices.includes(i)를 사용하여 indices 배열이 현재 인덱스 i를 포함하는지 확인합니다. 즉, indices 배열에 현재 인덱스가 존재하면 참이 됩니다.

참인 경우 0을 반환하여 해당 인덱스에 위치하는 문자를 0으로 대체합니다. 따라서 해당 인덱스에 해당하는 문자는 제외됩니다.

거짓인 경우 a를 반환하여 해당 인덱스에 위치하는 문자를 그대로 유지합니다.

filter 메서드를 사용하여 배열에서 0이 아닌 값만 필터링합니다.

filter(a => a !== 0)는 배열의 요소 a가 0이 아닌 경우에만 참인 새로운 배열을 반환합니다. 즉, 제외된 문자들이 0으로 대체되었으므로, 0을 제외하고 유지된 문자들만 남게 됩니다.

join("")을 사용하여 배열의 모든 요소를 하나의 문자열로 연결합니다.

join("")은 배열의 각 요소를 빈 문자열로 연결하여 문자열로 변환하는 역할을 합니다.

결과적으로, 함수는 주어진 문자열 my_string에서 indices 배열에 해당하는 인덱스에 위치하는 문자들을 필터링하고, 나머지 문자들을 연결하여 새로운 문자열을 반환합니다.

 

4. 카운트 다운 : 정수 start와 end가 주어질 때, start에서 end까지 1씩 감소하는 수들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

function solution(start, end) {
    var answer = [];
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
start end result
10 3 [10, 9, 8, 7, 6, 5, 4, 3]

 

답 확인하기
function solution(start, end) {
    return Array.from({length: start + 1}, (_, i) => i).splice(end).reverse();
}

 

해설 확인하기

이 함수는 주어진 시작 숫자 start와 끝 숫자 end를 사용하여, 시작 숫자부터 끝 숫자까지의 연속된 숫자 중에서 end 이후의 숫자들을 거꾸로 정렬하여 배열로 반환하는 기능을 수행합니다.

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

{length: start + 1}을 사용하여 길이가 start + 1인 새로운 객체를 생성합니다. 이 객체는 Array.from 메서드로 배열을 생성하기 위한 역할을 합니다. start + 1이므로 시작 숫자부터 시작하여 start까지의 숫자를 포함한 배열을 생성하려는 의도입니다.

Array.from 메서드는 첫 번째 인수로 전달된 객체를 기반으로 배열을 생성합니다. 두 번째 인수로 전달된 콜백 함수 (_, i) => i는 배열의 각 요소에 대해 실행됩니다. 여기서 _는 현재 요소를 의미하지만 사용되지 않으며, i는 현재 요소의 인덱스를 나타냅니다.

splice(end)를 사용하여 배열의 end 인덱스 이후의 요소들을 제거합니다. splice 메서드는 배열의 요소를 제거하고, 제거한 요소들을 새로운 배열로 반환합니다. 여기서는 end 인덱스 이후의 요소들을 제거하기 때문에, 시작 숫자부터 end까지의 숫자들만 남게 됩니다.

reverse()를 사용하여 배열의 요소들을 거꾸로 정렬합니다. reverse 메서드는 배열의 순서를 반대로 뒤집습니다.

최종적으로 거꾸로 정렬된 배열이 반환됩니다.

따라서, 함수는 주어진 시작 숫자부터 끝 숫자까지의 연속된 숫자 중에서 end 이후의 숫자들을 거꾸로 정렬하여 배열로 반환합니다.

 

5. 가까운 1찾기 : 정수 배열 arr가 주어집니다. 이때 arr의 원소는 1 또는 0입니다. 정수 idx가 주어졌을 때, idx보다 크면서 배열의 값이 1인 가장 작은 인덱스를 찾아서 반환하는 solution 함수를 완성해 주세요. 단, 만약 그러한 인덱스가 없다면 -1을 반환합니다.

function solution(arr, idx) {
    var answer = 0;
    return answer;
}

길라잡이

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

 

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

 

해설 확인하기

이 함수는 주어진 배열 arr과 시작 인덱스 idx를 사용하여, 배열에서 주어진 시작 인덱스부터 끝까지의 요소를 반복하면서 첫 번째로 값이 1인 요소의 인덱스를 반환하는 기능을 수행합니다.

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

for 루프를 사용하여 배열 arr에서 주어진 시작 인덱스 idx부터 끝까지의 요소를 반복합니다. 루프 변수 i는 idx부터 시작하여 배열의 길이까지 증가하는 역할을 합니다.

각 반복마다 현재 인덱스 i에 해당하는 배열의 요소를 cur 변수에 저장합니다.

cur === 1을 사용하여 현재 요소 cur의 값이 1인지 확인합니다.

만약 cur === 1 조건이 참이라면, 즉 첫 번째로 값이 1인 요소를 찾았다면 해당 인덱스 i를 반환하고 함수를 종료합니다.

반복이 모두 완료되었지만 1인 요소를 찾지 못한 경우, return -1을 통해 -1을 반환합니다. 이는 1인 요소가 없는 경우를 나타냅니다.

결과적으로, 함수는 주어진 배열 arr에서 시작 인덱스 idx부터 끝까지의 요소를 탐색하면서 첫 번째로 값이 1인 요소의 인덱스를 반환하거나, 1인 요소가 없을 경우 -1을 반환합니다.

728x90
반응형