문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.

1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.

2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한사항

array의 길이는 1 이상 100 이하입니다.

array의 각 원소는 1 이상 100 이하입니다.

commands의 길이는 1 이상 50 이하입니다.

commands의 각 원소는 길이가 3입니다.

 

ex)

array: [1, 5, 2, 6, 3, 7, 4]

commands: [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

return: [5, 6, 3]

 

나의 풀이

function solution(array, commands) {
	// return할 array answer 배열을 생성한다
    var answer = []
    for(let i=0; i<commands.length; i++) {
    	// array를 commands[i][0]-1번째부터 commands[i][1]까지 slice 후, 오름차순 정렬 후 arr에 할당
        var arr = array.slice(commands[i][0]-1, commands[i][1]).sort((a,b)=>{return a-b})
        // arr의 commands[i][2]-1번째 원소를 answer 배열에 push
        answer.push(arr[commands[i][2]-1])
    }
    // answer을 리턴
    return answer
}

slice와 sort를 이용하여 해결했다.

처음에는 array.slice(...).sort()만 사용했다가 error가 발생했다.

sort()는 파라미터를 생략하면 문자열의 유니코드 포인트 순서를 따라서 정렬하기 때문에 숫자를 정렬할 경우, 문자열을 반환하기 때문에 조건을 따로 주는 것이 좋다.

 

원래 코드

...
var arr = array.slice(commands[i][0]-1, commands[i][1]).sort()
...

 

변경 후 코드

...
var arr = array.slice(commands[i][0]-1, commands[i][1]).sort((a,b)=>{return a-b})
...

👍

문제 설명

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

 

제한 사항

  • 1 ≤ p의 길이 ≤ 18
  • p의 길이 ≤ t의 길이 ≤ 10,000
  • t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

 

ex)

t: "3141592"

p: "271"

result: 2

 

나의 solution

function solution(t, p) {
	// answer 배열 생성
    var answer = [];
    for(let i=0; i<t.length; i++) {
        var ele = t.slice(i, i+p.length)
        // 배열에 들어갈 ele의 길이는 p의 길이와 같고 ele의 값은 p보다 작거나 같아야 한다
        if(ele.length===p.length && ele<=p) answer.push(ele)
    }
    // 배열의 길이를 리턴
    return answer.length
}

 

Description

1. slice 메소드를 사용하면 간단하게 해결할 수 있다.

// slice 메소드는 배열의 begin index부터 end index까지(end index는 포함x)에 대한 복사본을 새로운 배열로 반환한다.

array = ['world','earth','sun','moon','mars']

console.log(array.slice(2));
// ['sun','moon','mars']

console.log(array.slice(2, 4));
// Expected output: Array ['sun','moon']

console.log(array.slice(-2));
// Expected output: Array ['moon','mars']

console.log(array.slice(2, -1));
// Expected output: Array ['sun','moon']

헷갈릴 수도 있는 splice 메소드는 아래와 같다.

// splice 메소드는 원본 배열에서 새로운 요소를 추가, 삭제, 교체하여 새로운 배열을 리턴한다.

array = ['world','earth','sun','moon','mars']

// 삭제(시작 index가 음수일 경우 뒤에서부터 요소를 센다)
array.splice(2, 1) // index 2부터 1개의 요소 제거
console.log(array) // ['world','earth','moon','mars']

// 추가
array.splice(2,0,'venus')
console.log(array) // ['world','earth','venus','sun','moon','mars']

2. 문자열 t를 i 인덱스부터 i+p.length 인덱스까지 잘라 변수 ele에 할당한다.

3. ele의 길이가 p의 길이와 같고 ele의 값이 p보다 작거나 같으면 answer 배열에 추가한다.

4. 마지막으로, answer 배열의 길이를 리턴한다.

문제 설명

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

 

제한 사항

두 수는 1이상 1000000이하의 자연수입니다.

 

ex)

n: 3, m: 12, return [3, 12]

 

 

최대 공약수: 두 수 n, m의 공통된 약수 중에서 가장 큰 수

최소 공배수: 두 수 n, m의 공통된 배수 중에서 가장 작은 수

 

이 문제를 풀기 위해서는 다음과 같은 원리를 이용할 수 있다.

- 유클리드 호제법

- num1 * num2 = gcd * lcm

 

유클리드 호제법

1. n>m일 때, 큰 수(n)를 작은 수(m)로 나눈다. (n % m = R1)

2. 나누는 수 m을 나눈 나머지 R1로 나눈다. (m % R1 = R2)

3. R1을 R2로 나눈다. (R1 % R2 = R3)

이 과정을 반복해서 Rn이 0이 된다면 나누는 수(Rn-1)가 최대공약수이다.

 

Answer

function solution(n, m) {
    const gcd = (a, b) => a%b === 0 ? b : gcd(b, a%b);
    const lcm = (a, b) => (a*b) / gcd(a,b);
    
    return [gcd(n,m), lcm(n,m)]
}

문제설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

 

제한 조건

행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

 

ex)

arr1: [[1,3], [2,4]]

arr2: [[3,5], [7,8]]

return: [[4,8], [9,12]]

 

function solution(arr1, arr2) {
    var answer = [];
    for(let i = 0; i<arr1.length; i++) {
        var sum = [];
        for(let j = 0; j<arr1[i].length; j++) {
            console.log(arr1[i][j]+arr2[i][j]);
            sum.push(arr1[i][j]+arr2[i][j])
        }
        answer.push(sum);
    } return answer;
}

빈 배열 answer을 생성하고 for문을 통해 두 개의 배열을 같은 인덱스끼리 더해준다.

문제설명

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

 

제한사항

s는 길이 1 이상, 길이 8 이하인 문자열입니다.

s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.

 

function solution(s) {
	// s의 length가 4 또는 6
    if (s.length == 4 || s.length == 6) {
    	// 문자열 분해 후, isNaN으로 검사
        return s.split('').every(c => !isNaN(c))
    } else {
        return false;
    }
}

 

isNaN()

타입이 숫자인지 아닌지 판별하는 함수로 많이 쓰인다.

 

every()

모든 원소가 주어진 조건에 맞는지 확인하는 함수

isNaN만 사용하게 되면 E가 붙은 지수도 숫자로 인식할 수 있기 때문에 every를 사용하여 하나하나 검사한 후, return한다.

문제 설명

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

1 ≤ left ≤ right ≤ 1,000

 

ex)

left: 13, right: 17 👉 result: 43

left: 24, right: 27 👉 result: 52

 

function solution(left, right) {
    var answer=0;
    for(let i = left; i<right+1; i++) {
        if (Number.isInteger(Math.sqrt(i))) {
            answer -= i
        } else {
            answer +=i
        }
    }
    return answer;
}

 

제곱근이 정수면 약수의 개수는 홀수인 것을 이용했다.

 

Number.isInteger(n)

숫자(n)가 정수면 true, 아니면 false를 return한다

 

Math.sqrt(i)

숫자(i)의 제곱근을 return한다

문제 설명

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

 

제한 조건

n은 길이 10,000이하인 자연수입니다.

 

ex)

n = 2인 경우, '수박'을 출력

n = 3인 경우, '수박수'를 출력

 

// 주어진 n번만큼 '수박'을 반복하고 0번째부터 n번째 전까지 잘라낸다
function solution(n) {
    return "수박".repeat(n).substring(0, n)
}

repeat(n)

주어진 문자열을 주어지는 n만큼 반복하는 함수

 

substring(a, b)

문자열을 a번째부터 b번째 전까지 잘라내는 함수(slice 함수와 동일하다)

 

substr(a, b)

a번째부터 b길이만큼 잘라내는 함수

문제 설명

영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • my_string은 소문자와 공백으로 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000

 

입출력 예

  • "bus"에서 모음 u를 제거한 "bs"를 return합니다.
  • "nice to meet you"에서 모음 i, o, e, u를 모두 제거한 "nc t mt y"를 return합니다.

 

나의 풀이

function solution(my_string) {
	// 알파벳 모음
    const str = 'aeiou'
    // split으로 분해, filter로 str에 속한 el 제거 후, join
    let answer = my_string.split('').filter((el)=>(!str.includes(el))).join('')
    return answer;
}

+ Recent posts