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

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

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

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

 

코딩 기초 트레이닝 Day40

 

 

1. 조건에 맞게 수열 변환하기1 : 정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱합니다. 그 결과인 정수 배열을 return 하는 solution 함수를 완성해 주세요.

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

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
arr result
[1, 2, 3, 100, 99, 98] [2, 2, 6, 50, 99, 49]

 

답 확인하기
function solution(arr) {
    return arr.map(a => {
        if(a >= 50 && a %2 ===0) return Math.floor(a/2)
        if(a < 50 && a %2 === 1) return a*2
        return a
    })
}

 

해설 확인하기

배열 arr을 받아서 각 요소에 대해 다음과 같은 변환을 수행한 후 결과 배열을 반환하는 함수입니다. 코드의 동작을 단계별로 해석한 설명은 아래와 같습니다:

arr.map(a => {...})를 사용하여 arr 배열을 순회하면서 각 요소에 대한 변환을 수행합니다. map 함수는 콜백 함수를 사용하여 배열의 각 요소를 변환하고, 변환된 요소들로 이루어진 새로운 배열을 반환합니다.

if(a >= 50 & & a % 2 === 0) 조건문을 사용하여 현재 요소 a가 50 이상이고 짝수인지 확인합니다.

조건이 참이면, return Math.floor(a/2)를 사용하여 a를 2로 나눈 몫을 반환합니다. Math.floor 함수를 사용하여 정수 값을 얻습니다.

if(a < 50 & & a % 2 === 1) 조건문을 사용하여 현재 요소 a가 50 미만이고 홀수인지 확인합니다.

조건이 참이면, return a * 2를 사용하여 a를 2배로 곱한 값을 반환합니다.

위의 조건문에 해당하지 않는 경우, return a를 사용하여 현재 요소 a를 그대로 반환합니다.

map 함수가 수행된 결과 배열이 반환됩니다.

이 함수는 arr 배열의 각 요소를 조건에 따라 변환한 후, 변환된 요소들로 이루어진 새로운 배열을 반환합니다. 조건에 따라서 50 이상이고 짝수인 요소는 2로 나눈 몫을 반환하고, 50 미만이고 홀수인 요소는 2배를 한 값을 반환하며, 나머지 경우에는 요소를 그대로 반환합니다.

 

2. 조건에 맞게 수열 변환하기2 : 정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다. 이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요. 단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.

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

길라잡이

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

 

답 확인하기
function solution(arr) {
  let answer = 0;
  let count = 0;
  let beforArr = [...arr];

  while (count !== arr.length) {
    count = 0;
    beforArr = [...arr];

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

    answer++;
  }

  return answer - 1;
}

 

해설 확인하기

배열 arr을 받아서 반복적으로 요소들을 변환하는 과정을 수행하고, 변환 횟수를 반환하는 함수입니다. 아래는 코드의 동작을 단계별로 해석한 설명입니다:

변수 answer를 0으로 초기화합니다. 이 변수는 변환 횟수를 저장하기 위해 사용됩니다.

변수 count를 0으로 초기화합니다. 이 변수는 변환 과정에서 이전 배열과 동일한 요소의 개수를 세기 위해 사용됩니다.

beforArr 배열을 arr 배열로 복사합니다. beforArr는 이전 배열의 상태를 저장하기 위해 사용됩니다.

while (count !== arr.length)를 사용하여 변환 과정을 반복합니다. 이전 배열과 동일한 요소의 개수가 배열의 길이와 같아지면 반복을 종료합니다.

count를 0으로 초기화합니다.

beforArr 배열을 arr 배열로 복사합니다.

for 루프를 사용하여 배열 arr의 각 요소에 대해 변환을 수행합니다. 루프 변수 i는 0부터 배열의 길이보다 작을 때까지 1씩 증가합니다.

조건문 if (arr[i] % 2 === 0 & & arr[i] >= 50)을 사용하여 현재 요소 arr[i]가 50 이상이고 짝수인지 확인합니다.

조건이 참이면, arr[i] /= 2를 사용하여 arr[i]를 2로 나눕니다.

조건문 else if (arr[i] % 2 !== 0 & & arr[i] < 50)을 사용하여 현재 요소 arr[i]가 50 미만이고 홀수인지 확인합니다.

조건이 참이면, arr[i] = arr[i] * 2 + 1을 사용하여 arr[i]를 2배하고 1을 더합니다.

조건문 if (arr[i] === beforArr[i])을 사용하여 현재 요소 arr[i]와 이전 배열의 beforArr[i] 요소를 비교합니다.

만약 현재 요소와 이전 배열의 요소가 동일하다면, count를 1 증가시킵니다.

answer를 1 증가시킵니다.

while 루프가 종료된 후, answer - 1을 반환합니다.

이 함수는 주어진 배열을 반복적으로 변환하여 이전 배열과 동일한 요소의 개수가 배열의 길이와 같아지는 변환 횟수를 반환합니다.

 

3. 1로 만들기 : 정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 됩니다. 예를 들어 10이 있다면 다음과 같은 과정으로 1이 됩니다.

  • 10 / 2 = 5
  • (5 - 1) / 2 = 4
  • 4 / 2 = 2
  • 2 / 2 = 1

위와 같이 4번의 나누기 연산으로 1이 되었습니다. 정수들이 담긴 리스트 num_list가 주어질 때, num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 return하도록 solution 함수를 완성해주세요.

function solution(num_list) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
num_list result
[12, 4, 15, 1, 14] 11

 

 

답 확인하기
function solution(num_list) {
    var answer = 0;
    const fun =(num)=>{
        let c=num;
//2. c가 1이라면 c를 리턴하여 재귀함수를 끝낸다.
        if(c===1) return c;
//3. c가 짝수라면 c/2 해준다.
//4. 연산이 한번 들어갔으니 answer에 1을 더해준다.
        if(c%2===0) {
            answer++
            c=c/2;
        }
//5. c가 홀수라면 (c-1)/2해준다.
//6. 연산이 한번 들어갔으니 answer에 1을 더해준다. 
        else if(c%2===1) {
            answer++
            c=(c-1)/2;
        }
// 7. 재귀함수를 계속 돌려준다. 
        return fun(c)
    }
// 1. num_list를 순회하여 재귀함수 fun()함수를 실행한다.
    for(let c of num_list){
       fun(c)
    }
    return answer;
}

 

해설 확인하기

주어진 배열 num_list를 순회하면서 재귀 함수 fun을 호출하여 연산을 수행하고, 연산 횟수인 answer를 반환하는 함수입니다. 코드의 동작을 단계별로 해석한 설명은 아래와 같습니다:

fun 함수는 num이라는 매개변수를 받아서 연산을 수행하는 재귀 함수입니다.

변수 c를 num으로 초기화합니다.

만약 c가 1이라면, 재귀 함수를 끝내고 c를 반환합니다.

c가 짝수라면, c를 2로 나눕니다. 이때 연산이 한 번 수행되었으므로 answer에 1을 더해줍니다.

c가 홀수라면, c에서 1을 빼고 2로 나눕니다. 이때 연산이 한 번 수행되었으므로 answer에 1을 더해줍니다.

재귀 함수를 c를 매개변수로 호출하여 다시 실행합니다.

fun 함수가 완전히 실행되지 않고 재귀 호출을 통해 다시 실행되는 방식으로 연산을 반복합니다.

solution 함수는 num_list를 순회하면서 각 요소에 대해 fun 함수를 실행합니다.

최종적으로 answer를 반환합니다.

이 함수는 주어진 배열의 각 요소를 재귀 함수를 통해 연산하고, 연산 횟수를 반환합니다. 함수가 짝수인 경우에는 2로 나누고, 홀수인 경우에는 1을 빼고 2로 나누며, 재귀 호출을 통해 연산을 반복합니다. 최종적으로 연산 횟수인 answer가 반환됩니다.

 

4. 길이에 따른 연산 : 정수가 담긴 리스트 num_list가 주어질 때, 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을 10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요.

function solution(num_list) {
    var answer = 0;
    return answer;
}

길라잡이

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

 

답 확인하기
function solution(num_list) {
  let sum = 0;
  let mul = 1;
  let answer = 0;

  for (let i = 0; i < num_list.length; i++) {
    if (num_list.length >= 11) {
      sum += num_list[i];
      answer = sum;
    } else {
      mul *= num_list[i];
      answer = mul;
    }
  }

  return answer;
}

 

해설 확인하기

주어진 num_list 배열의 길이에 따라 다른 연산을 수행하고, 결과를 반환합니다. 아래는 코드의 동작을 단계별로 해석한 설명입니다:

변수 sum을 0으로 초기화합니다. 이 변수는 배열의 길이가 11 이상인 경우 요소들을 더할 때 사용됩니다.

변수 mul을 1로 초기화합니다. 이 변수는 배열의 길이가 11 미만인 경우 요소들을 곱할 때 사용됩니다.

변수 answer를 0으로 초기화합니다. 이 변수는 최종적으로 반환될 결과값을 저장합니다.

for 루프를 사용하여 배열 num_list의 각 요소에 대해 반복합니다. 루프 변수 i는 0부터 배열의 길이보다 작을 때까지 1씩 증가합니다.

조건문 if (num_list.length >= 11)을 사용하여 배열의 길이가 11 이상인지 확인합니다.

조건이 참이면, 현재 요소 num_list[i]를 sum에 더합니다.

answer에 sum 값을 저장합니다.

조건이 거짓이면, 현재 요소 num_list[i]를 mul에 곱합니다.

answer에 mul 값을 저장합니다.

반복이 완료되면, answer 값을 반환합니다.

이 함수는 주어진 배열 num_list의 길이에 따라 다른 연산을 수행하고, 최종 결과값을 반환합니다. 배열의 길이가 11 이상인 경우에는 요소들을 더하고, 11 미만인 경우에는 요소들을 곱한 결과값을 반환합니다.

 

5. 원하는 문자열 찾기 : 알파벳으로 이루어진 문자열 myString과 pat이 주어집니다. myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0을 return 하는 solution 함수를 완성해 주세요. 단, 알파벳 대문자와 소문자는 구분하지 않습니다.

function solution(myString, pat) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
myString pat return
"AbCdEfG" "aBc" 1
"aaAA" "aaaaa" 0

 

답 확인하기
function solution(myString, pat) {
  let answer = 0;
  
  if (myString.toLowerCase().includes(pat.toLowerCase())) {
    answer = 1;
  }
  
  return answer;
}

 

해설 확인하기

대소문자를 구분하지 않고 문자열 myString이 문자열 pat을 포함하는지 확인하는 기능을 수행합니다. 아래는 코드의 동작을 단계별로 해석한 설명입니다:

변수 answer를 0으로 초기화합니다. 이 변수는 결과값을 저장할 변수입니다.

myString.toLowerCase()을 사용하여 myString을 소문자로 변환합니다. .

includes(pat.toLowerCase())를 사용하여 myString이 pat을 포함하는지 확인합니다. 이때, pat도 소문자로 변환하여 비교합니다.

만약 myString이 pat을 포함하고 있다면, answer를 1로 설정합니다.

최종적으로 answer 값을 반환합니다.

이 함수는 myString 문자열이 대소문자를 구분하지 않고 pat 문자열을 포함하는지 여부를 판단하여 결과값을 반환합니다. myString과 pat을 소문자로 변환한 뒤에 포함 여부를 확인하고, 포함되어 있다면 answer를 1로 설정합니다.

728x90
반응형