스터디 기록8

유아현·2022년 11월 23일
0

Study

목록 보기
9/27
post-thumbnail

오늘의 스터디 문제 목록

1. 소수 찾기

function solution(n) {
    // 입력받은 1부터 n 사이에 있는 소수의 개수를 반환하기
    // 자기 자신만 나눠져야 되므로 2부터 n까지다른 수로 나누었을 때 0으로 떨어지면 안 됨
    // 자기 자신을 제외한 다른 수로 나누어졌을 때 false로 처리하고 for문을 빠져 나옴
    // 최종으로 true로 남아있으면 count++ 해 주고 리턴
    let count = 0;
    for(let i = 2 ; i <= n ; i++){
        let primeNum = true;
        
        for(let j = 2; j < i ; j++){
            if(i % j === 0){
                primeNum = false;
                break;
            }
        }
        
        if(primeNum === true){
            count++;
        }
    }
    return count;
}

처음 작성한 코드로는 테스트 케이스 통과가 되지 않아서 이 문제는 에라토스테네스의 체를 이용하면 풀 수 있다고 해서 에라토스테네스의 체를 이용해서 다시 풀어 보았다.

function solution(n) {
    // 에라토스테네스의 체
    // 배열에 숫자를 넣어서 0이 아닌 숫자 개수 구하기
    let arr = [0, 0]; // 0, 1은 소수가 아니니 0으로 채워두고 2부터 n까지 배열에 넣어준다
    for (let i = 2 ; i <= n ;  i++){
        arr[i] = i;
    }
    // 배수는 소수가 아니므로 배수의 인덱스에 0으로 바꾼다
    for(let i = 2 ; i <= n ; i++ ){
        if(arr[i] === 0) {
            continue;
        }
        for(let j = i * 2 ; j <= n ; j+= i){
            arr[j] = 0;
        }
    }
    // 0인 요소로만 이루어진(소수인) 배열의 길이 리턴
    return arr.filter(ele => {
       return ele !== 0;
    }).length;
}

코드를 작성하고 나니 생각보다 간당했던 접근 방법이었다 조금만 더 생각했으면 됐을 법한 문제인데 한 번 구글링의 맛을 보니... 몇 분 안 지나서 좋은 방법이 생각나지 않으면 바로 검색해버리는 습관이 생겨버렸다 구글링을 해서 도움받는 것도 좋지만 모든 것을 구글링에 의존하려는 버릇은 버려야겠다!

2. 모의고사

function solution(answers) {
    // 정답지 answers가 주어짐
    // 일포자: 1 2 3 4 5 순서대로 찍음
    // 이포자: 2를 고정으로 하고 뒤에 오는 수는 1, 3, 4, 5로 순서대로 찍음
    // 삼포자: 33 11 22 44 55 // 순으로 찍음
    // 한 한생씩 돌게 해서 카운트 먹여 주고 거기서 카운트 수가 가장 높은 걸 리턴
    
    // 2차원 배열로 수포자 시험지 모아두고 하나씩 채점해 보자
    const first = [1, 2, 3, 4, 5];
    const second = [2, 1, 2, 3, 2, 4, 2, 5];
    const third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    const math_test = [[...first], [...second], [...third]];
    
    let score = [];
    for(let student of math_test){ // 수포자 학생들의 정답 맞혔을 때 acc++ 해 줌, 맞힌 개수를 score에 push
        score.push(answers.reduce((acc, cur, idx) => {
            cur === student[idx % student.length] ? acc++ : acc;
            return acc;
        }, 0));
    };
    
    let max = Math.max(...score); // 가장 높은 점수 받은 사람
    let result = [];
    for(let i = 0; i < score.length ; i++){ // 최고 점수를 받은 사람의 인덱스를 가지고 와서 결과 배열에 넣어 줌
        if( max === score[i]){
            result.push(i+1);
        }
    }
    return result.sort((a, b) => a - b);
    
}

인덱스 수를 어떻게 줘야 할지 고민을 많이 했던 문제!! 나는 정답 대조를 reduce를 사용했지만 스터디원 분들을 보니까 클로저를 쓰신 분도 계셨고 문제 답안을 forEach로 돌면서 if로 학생들의 답안과 비교해서 답과 같으면 점수를 ++ 하신 분의 코드를 봤다 구조적으로는 비슷하나 역시 뭔가 미묘하게 달라서 도움이 됐다 2차원 배열로 해서 내 코드는 오히려 직관적으로는 눈에 안 들어왔달까... 초보인 것을 방패로 삼아 코드를 더럽게 쓰지 말자! 되도록 눈에 잘 들어오고 어떤 코드가 어떤 기능을 하는지... 클린 코드로 작성할 수 있도록 노력해야겠다

3. 소수 만들기

function number(sum){ // 소수 판별 함수
    let primeNum = true;
    for(let i = 2 ; i < sum ; i++){
        if( sum % i === 0){
            primeNum = false;
        }
    }
    return primeNum;
}


function solution(nums) {
    // nums에서 3개의 수를 더했을 때 소수가 되는 경우의 개수
    // 모든 조합 먼저 구하기
    // 소수를 판별하는 함수 하나 만들고 true면 count
    
    let count = 0;
    // 1. 3개의 수 더한다고 했으니까 삼중for문 돌려잇
    // 2. 3개 수를 더하기
    // 3. 그 값을 소수 판별하는 함수에 매개변수로 넘겨주기
    let sum = 0;
    for(let i = 0 ; i < nums.length ; i++){ // 1
        for(let j = i+1 ; j < nums.length ; j++){
            for(let k = j+1 ; k < nums.length ; k++){
                sum = nums[i] + nums[j] + nums[k]; // 2 
                
                if(number(sum)){
                    count++;
                }
            }
        }
    }
    
    return count;
}

처음으로 함수를 또 만들어서 호출하는 식으로 풀었던 문제다. 바로 전 스터디 회차 때 삼총사 문제에서 조금? 응용된 문제로 그냥 복붙해서... 소수만 판가름해 주는 함수만 추가했다. 이 문제에서는 ㄷㅇ님이 Max를 쓰신 게 기억에 많이 남았다

+ 이번 스터디를 통해서 확장성에 대한 고려가 언급되었다! 나 역시도 확장성까지 고려한 코드를 짜보도록 해 보자!
+ 스터디 과제를 진행하면서 에라토스테네스의 체에 대해서 알게 되었다!

0개의 댓글