🌠 문제

약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • 1 ≤ n ≤ 100

🌠 입출력 예

n result
10 5
15 8

🌠 입출력 예 설명

입출력 예 #1

  • 10 이하 합성수는 4, 6, 8, 9, 10 로 5개입니다. 따라서 5를 return합니다.

입출력 예 #2

  • 15 이하 합성수는 4, 6, 8, 9, 10, 12, 14, 15 로 8개입니다. 따라서 8을 return합니다.

🧞 풀이

function solution(n) {
    // 합성수를 찾는다는 것은 곧 소수를 찾아서 제외하는 것이라 봐도 된다.
    // 소수를 찾으려면? 다양한 방법이 있지만 에라토스테네스의 체를 써보자.
    
    // 길이가 n인 배열 선언 
    let arr = new Array(n).fill(0);
    
    // 2부터 시작하여 특정 수의 배수에 해당하는 수를 모두 지운다.
    for (let i = 2; i <= n; i++) {
        // 이미 지워진 수라면 건너뛴다.
        if(arr[i]==-1) continue;
        
        // 배수부터 출발하여, 가능한 모든 숫자를 지운다.
        for (let j = 2*i; j<=n; j+=i) {
            arr[j] = -1;
        }
    }
    
    // 합성수의 갯수는 -1을 값으로 가지는 원소의 갯수랑 동일하다.
    return arr.filter(e => e == -1).length;
}

🌠 문제

머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • box의 길이는 3입니다.
  • box[0] = 상자의 가로 길이
  • box[1] = 상자의 세로 길이
  • box[2] = 상자의 높이 길이
  • 1 ≤ box의 원소 ≤ 100
  • 1 ≤ n ≤ 50
  • n ≤ box의 원소
  • 주사위는 상자와 평행하게 넣습니다.

🌠 입출력 예

box n result
[1, 1, 1] 1 1
[10, 8, 6] 3 12

🌠 입출력 예 설명

입출력 예 #1

  • 상자의 크기가 가로 1, 세로 1, 높이 1이므로 모서리의 길이가 1인 주사위는 1개 들어갈 수 있습니다.

입출력 예 #2

  • 상자의 크기가 가로 10, 세로 8, 높이 6이므로 모서리의 길이가 3인 주사위는 12개 들어갈 수 있습니다.

🧞 풀이

function solution(box, n) {
    const a = parseInt(box[0] / n); 
    const b = parseInt(box[1] / n); 
    const c = parseInt(box[2] / n); 
    return a * b * c;
}

🌠 문제

정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • 3 ≤ numbers의 길이 ≤ 20
  • direction은 "left" 와 "right" 둘 중 하나입니다.

🌠 입출력 예

numbers direction result
[1, 2, 3] "right" [3, 1, 2]
[4, 455, 6, 4, -1, 45, 6] "left" [455, 6, 4, -1, 45, 6, 4]

🌠 입출력 예 설명

입출력 예 #1

  • numbers 가 [1, 2, 3]이고 direction이 "right" 이므로 오른쪽으로 한 칸씩 회전시킨 [3, 1, 2]를 return합니다.

입출력 예 #2

  • numbers 가 [4, 455, 6, 4, -1, 45, 6]이고 direction이 "left" 이므로 왼쪽으로 한 칸씩 회전시킨 [455, 6, 4, -1, 45, 6, 4]를 return합니다.

🧞 풀이

function solution(numbers, direction) {
    if (direction === "right") {
        numbers.unshift(numbers.pop());
    } else {
        numbers.push(numbers.shift());
    }
    return numbers;
}

🌠 문제

머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.

🌠 제한사항

  • 2 < numbers의 길이 < 100
  • 0 < k < 1,000
  • numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
  • numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.

🌠 입출력 예

numbers k result
[1, 2, 3, 4] 2 3
[1, 2, 3, 4, 5, 6] 5 3
[1, 2, 3] 3 2

🌠 입출력 예 설명

입출력 예 #1

  • 1번은 첫 번째로 3번에게 공을 던집니다.
  • 3번은 두 번째로 1번에게 공을 던집니다.

입출력 예 #2

  • 1번은 첫 번째로 3번에게 공을 던집니다.
  • 3번은 두 번째로 5번에게 공을 던집니다.
  • 5번은 세 번째로 1번에게 공을 던집니다.
  • 1번은 네 번째로 3번에게 공을 던집니다.
  • 3번은 다섯 번째로 5번에게 공을 던집니다.

입출력 예 #3

  • 1번은 첫 번째로 3번에게 공을 던집니다.
  • 3번은 두 번째로 2번에게 공을 던집니다.
  • 2번은 세 번째로 1번에게 공을 던집니다.
  • ※ 공지 - 2023년 1월 25일 테스트 케이스가 추가되었습니다. 기존에 제출한 코드가 통과하지 못할 수도 있습니다.

🧞 풀이

function solution(numbers, k) {
    // k가 1이 되기 전까지 한 사람 건너뛰니까 
    // 두 번 shift()한 걸 뒤에 push()
    while (k != 1) {
        numbers.push(numbers.shift());
        numbers.push(numbers.shift());
        k --;
    }
    return numbers[0];
}

🌠 문제

정수 배열 num_list와 정수 n이 매개변수로 주어집니다. num_list를 다음 설명과 같이 2차원 배열로 바꿔 return하도록 solution 함수를 완성해주세요.

num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 num_list를 2 * 4 배열로 다음과 같이 변경합니다. 2차원으로 바꿀 때에는 num_list의 원소들을 앞에서부터 n개씩 나눠 2차원 배열로 변경합니다.

num_list n result
[1, 2, 3, 4, 5, 6, 7, 8] 2 [[1, 2], [3, 4], [5, 6], [7, 8]]

🌠 제한사항

  • num_list의 길이는 n의 배 수개입니다.
  • 0 ≤ num_list의 길이 ≤ 150
  • 2 ≤ n < num_list의 길이

🌠 입출력 예

num_list n result
[1, 2, 3, 4, 5, 6, 7, 8] 2 [[1, 2], [3, 4], [5, 6], [7, 8]]
[100, 95, 2, 4, 5, 6, 18, 33, 948] 3 [[100, 95, 2], [4, 5, 6], [18, 33, 948]]

🌠 입출력 예 설명

입출력 예 #1

  • num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 2 * 4 배열로 변경한 [[1, 2], [3, 4], [5, 6], [7, 8]] 을 return합니다.

입출력 예 #2

  • num_list가 [100, 95, 2, 4, 5, 6, 18, 33, 948] 로 길이가 9이고 n이 3이므로 3 * 3 배열로 변경한 [[100, 95, 2], [4, 5, 6], [18, 33, 948]] 을 return합니다.

🧞 풀이

function solution(num_list, n) {
    // 정답 담을 배열 선언
    let answer = [];
    
    // 정답 배열에 넣을 각각의 배열을 만들어 줄 임시 변수 선언
    let tmp_array = [];
    
    // num_list에서 하나씩 shift()해서 임시 배열에 할당
    while (num_list.length != 0) {
        for (let i = 1; i <= n; i++) {
            tmp_array.push(num_list.shift());
        }
        answer.push(tmp_array);
        tmp_array = [];
    }
    
    // 정답 리턴
    return answer;
}

🌠 문제

사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다. 사분면은 아래와 같이 1부터 4까지 번호를매깁니다.

  • x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다.
  • x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다.
  • x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.
  • x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다.

x 좌표 (x, y)를 차례대로 담은 정수 배열 dot이 매개변수로 주어집니다. 좌표 dot이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.

🌠 제한사항

  • dot의 길이 = 2
  • dot[0]은 x좌표를, dot[1]은 y좌표를 나타냅니다
  • -500 ≤ dot의 원소 ≤ 500
  • dot의 원소는 0이 아닙니다.

🌠 입출력 예

dot result
[2, 4] 1
[-7, 9] 2

🌠 입출력 예 설명

입출력 예 #1

  • dot이 [2, 4]로 x 좌표와 y 좌표 모두 양수이므로 제 1 사분면에 속합니다. 따라서 1을 return 합니다.

입출력 예 #2

  • dot이 [-7, 9]로 x 좌표가 음수, y 좌표가 양수이므로 제 2 사분면에 속합니다. 따라서 2를 return 합니다.

🧞 풀이

function solution(dot) {
    if (dot[0] > 0) {
        if (dot[1] > 0) {
            return 1;
        } else {
            return 4;
        }
    } else {
        if (dot[1] > 0) {
            return 2;
        } else {
            return 3;
        }
    }
}

🌠 문제

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.

🌠 제한사항

  • 1 ≤ balls ≤ 30
  • 1 ≤ share ≤ 30
  • 구슬을 고르는 순서는 고려하지 않습니다.
  • share ≤ balls

🌠 입출력 예

balls share result
3 2 3
5 3 10

🌠 입출력 예 설명

입출력 예 #1

  • 서로 다른 구슬 3개 중 2개를 고르는 경우의 수는 3입니다.

입출력 예 #2

  • 서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.

서로 다른 n개 중 m개를 뽑는 경우의 수 공식


🧞 풀이

function solution(balls, share) {
    // 둘이 같은 경우는 1 리턴
    if (balls == share ) {
        return 1;
    }
    
    // 분자의 경우, n!과 m!이 약분되는 것을 고려
    let deno = 1;
    for (let i = balls; i > share; i --) {
        deno = deno * i;
    }
    
    // 분모의 경우, (n-m)!을 계산
    let nume = 1;
    for (let i = 1; i <= balls - share; i ++) {
        nume = nume * i;
    } 
    
    // 둘을 나눌 때, 경우의 수는 정수로 출력되어야 함
    return Math.round(deno / nume);
}

🌠 문제

가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.

🌠 제한사항

  • 0 < rsp의 길이 ≤ 100
  • rsp와 길이가 같은 문자열을 return 합니다.
  • rsp는 숫자 0, 2, 5로 이루어져 있습니다.

🌠 입출력 예

rsp result
"2" "0"
"205" "052"

🌠 입출력 예 설명

입출력 예 #1

  • "2"는 가위이므로 바위를 나타내는 "0"을 return 합니다.

입출력 예 #2

  • "205"는 순서대로 가위, 바위, 보이고 이를 모두 이기려면 바위, 보, 가위를 순서대로 내야하므로 “052”를 return합니다.

🧞 풀이

function solution(rsp) {
    // 배열로 변환
    const rsp_array = rsp.split("");
    // 배열의 각 요소가 가위, 바위, 보일 때, 바위, 보, 가위로 변환하여 다시 문자열로 합치기
    return rsp_array.map(e => e == 2 ? 0 : e == 0 ? 5 : 2).join("");
}

🌠 문제

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.

morse = { 
    '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
    '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
    '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
    '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
    '-.--':'y','--..':'z'
}

🌠 제한사항

  • 1 ≤ letter의 길이 ≤ 1,000
  • return값은 소문자입니다.
  • letter의 모스부호는 공백으로 나누어져 있습니다.
  • letter에 공백은 연속으로 두 개 이상 존재하지 않습니다.
  • 해독할 수 없는 편지는 주어지지 않습니다.
  • 편지의 시작과 끝에는 공백이 없습니다.

🌠 입출력 예

letter result
".... . .-.. .-.. ---" "hello"
".--. -.-- - .... --- -." "python"

🌠 입출력 예 설명

  • 입출력 예 #1
    .... = h
    . = e
    .-.. = l
    .-.. = l
    --- = o
    따라서 "hello"를 return 합니다.
  • 입출력 예 #2
    .--. = p
    -.-- = y
    - = t
    .... = h
    --- = o
    -. = n
    따라서 "python"을 return 합니다.
  • a ~ z에 해당하는 모스부호가 순서대로 담긴 배열입니다.
  • {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."}

🧞 풀이

function solution(letter) {
    morse = { 
        '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
        '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
        '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
        '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
        '-.--':'y','--..':'z'
    };
    
    // 문자열 letter를 공백 기준으로 하나의 요소가 되는 배열로 변환
    const letter_array = letter.split(" ");
    
    // map으로 morse 객체의 value 값으로 각 요소를 바꾸고, 이를 공백없이 문자열로 합치기
    return letter_array.map(l => morse[l]).join("");
}

+ Recent posts