[알고리즘]프로그래머스 0단계 뽀개기(Day11)

HIHI JIN·2023년 2월 8일

알고리즘

목록 보기
9/29
post-thumbnail

Day 11

주사위의 개수

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

//내 코드
function solution(box, n) {
    let a =  Math.floor(box[0]/n);
    let b =  Math.floor(box[1]/n);
    let c =  Math.floor(box[2]/n);
    return a*b*c;
}
//box[가로, 세로, 높이] n:주사위 모서리 길이, 상자에 들어갈 수 있는 주사위 최대 개수 리턴
/*원래 부피구하는 공식을 적용했더니 문제조건에 오류가 있어서 실패가 떴다.
let a= n*n*n;
let b = box[0]*box[1]*box[2];
return Math.floor(b/a);
*/

//다른 사람 코드
function solution(box, n) {
    let [width, length, height] = box;
    return Math.floor(width / n) * Math.floor(length / n) * Math.floor(height / n);
}//구조분해할당 이용

합성수 찾기

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

//내 코드
//이문제의 함정은 49나 25같이 소수(5,7)를 약수로 갖는 합성수를 구하는 것이다.
//처음 2나 3으로 나눠지는 것만 생각했다가 49의 경우 1,7,49를 가지므로 49도 포함해야 한다는 것을 알았다.
//그래서 아예 숫자를 나열하고 1부터 n까지의 약수를
//1, 자기자신외에 나눠지는 게 하나 이상이라면 총 약수가 3개인것을 구해서 배열에 넣었다.
function solution(n) {
    let arr = [];
    for(let i = 1; i <= n; i++) { //1부터 n까지의 정수
        let cnt = 0
        for(j = 1; j <= i; j++) { //1부터 n까지의 정수
            if(i % j === 0) cnt ++ //i가 j로 나눠지면 카운트세기
        }
        if(cnt >= 3) { //i가 j로 나눠지는 게 3번이상이면=1과 나자신외에 또 어떤 수와 나눠진다면 합성수!
            arr.push(i); //합성수인 i를 배열에 넣기
        }
    }
    return arr.length;
}
//n이하의 합성수 개수 리턴

//다른 사람 코드
function solution(n) {
    let dp = new Array(n+1).fill(1)
    for(let i = 2 ; i <= n ; i++){
        if(dp[i]){
            for(let j = 2 ; i*j <= n ; j++){
                dp[i*j] = 0
            }
        }
    }
    return dp.filter(el => el === 0).length
}//new Array(n+1)는 n+1수만큼의 요소를 가진 배열 생성
//현재 dp요소들 모두 undefinend
//fill(1)로 dp요소들 모두 1로 바꿔주기
//합성수는 2*2=4부터 시작이므로 i,j시작을 2로 시작
//dp의 i*j인덱스 값이 0으로 바꿔주기
//요소가 0인것만 필터해서 길이구하기

최댓값 만들기(1)

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

//내 코드
function solution(numbers) {
    let a = Math.max(...numbers);
    let aIndex = numbers.indexOf(a);
    numbers.splice(aIndex,1);
    let b = Math.max(...numbers);
    return a*b;
}
//numbers에서 가장 큰 요소를 구하고 배열에 빼기
//numbers에서 두번째로 큰 요소를 구하고 첫번째와 2번째 큰 요소 곱해서 리턴

//다른 사람 코드
function solution(numbers) {
    numbers.sort((a,b)=>b-a);
    return numbers[0]*numbers[1];
}//내림차순(큰 수부터 차례로)으로 다시 정렬하고 제일 큰 수와 2번째 큰 수 곱해주기

팩토리얼

i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 4 3 2 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
i! ≤ n

//내 코드
function solution(n) {
    let answer = [];
    let result = 1;
    if(n===1) return 1;
    for(let i=2; result<=n; i++){
            result*=i;
            answer.push(i);
    }
    return answer[answer.length-2];
}
//만약 5라면 5보다 작은 i!의 값리턴
//1*2까지만 가능 2리턴
//result=result*i로 i는 1부터 result가 n보다작거나같을때까지 반복
//이때 커지면 for문이 중단되므로 중단되기 직전의 i가 필요하다.
//answer.push로 i를 넣고 제일끝에서 앞의 i값 받아오기

//다른 사람 코드
function solution(n) {
    let i = 1;
    let f = 1;
    while (f*i < n) f*=++i;
    return i;
}//while문으로 반복, f*i, f*(i+1), f*(i+2)...반복하며 계속 f*i를 한다.
//f*i가 n보다 작을때까지 반복, 커지면 멈추고, 커지기 전의 i를 반환한다.
profile
신입 프론트엔드 웹 개발자입니다.

1개의 댓글

comment-user-thumbnail
2023년 2월 23일

열심히하시는 모습 너무 보기 좋네요ㅎㅎ 같이 화이팅 해요!

답글 달기