본문 바로가기
algorithm/문제풀이

완전탐색 > 모의고사

by yongfront 2024. 3. 29.
반응형
SMALL

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

let p1 = [1, 2, 3, 4, 5];

let p2 = [2, 1, 2, 3, 2, 4, 2, 5];

let p3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

이 반복되는 것을 볼 수 있다

 

문제의 수가 찍는 방식패턴 하나보다 더 많을 수 있기 때문에

나중에 이걸 어찌 반복시키는지는 후에 알아보기로 함

for문으로 반복시키는 것보다 더 간단한 방법이 있을 것이다

let s1 = 0, s2 = 0, s3 = 0;로 각 문제를 맞춘 정답의 변수를 0으로 초기화해놓고

문제의 수만큼 각각 반복시켜서 ++ 하는 식으로 처리하고

그걸 배열에 담은 담에 제일 높은 숫자의 length를 리턴하는 식으로 하면 될 듯

단, 정답의 숫자가 같을 경우엔 공동 1위로 인정하여 모두다 리턴

 

 

막혔던 부분 1

문제의 수가 더 많을 경우를 대비하여 p1, p2, p3 가 반복되도록 해야하는데 반복문보다는 더 간단하게 연산자로 가능하다는 것을 GPT를 써서 알아냄 ㅜㅜ

if (answers[i] === p1[i])의 단순 비교가 아니라

if (answers[i] === p1[i % p1.length])로 쉽게 가능

 

막혔던 부분 2

어떻게 최고 고득점자를 필터링 할수 있을 것인지(그리고 공동 1위는 어떻게 뽑아낼 것인지)

어떻게 풀지 생각은 됐지만 표현이 어려운 부분이었는데

Math.max함수와 단순 for문으로 해결

 

let s = [s1, s2, s3];

let maxScore = Math.max(...s);

let s = [s1, s2, s3]는 나름 구조 분해 할당인 줄 알았던 그냥 단순 배열 리터럴

아래는 찐 구조 분해 할당의 예시

let scores = [100, 200, 300];
let [score1, score2, score3] = scores;

그리고 위의 배열 리터럴을 선언할 때 for 문이 돌기전으로 하면 값을 못 받아오는 상황이 있었음

이건 자료구조와 메모리 관련 공부를 좀 더 보강해야 함

최고득점자 공동순위 뽑아내기

    for (let i = 0; i < s.length; i++) {
        if (s[i] === maxScore) {
            result.push(i + 1);
        }
    }

 

최종 정답

function solution(answers) {
    let p1 = [1, 2, 3, 4, 5];
    let p2 = [2, 1, 2, 3, 2, 4, 2, 5];
    let p3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

    let s1 = 0, s2 = 0, s3 = 0;

    for (let i = 0; i < answers.length; i++) {
        if (answers[i] === p1[i % p1.length]) {
            s1++;
        }
        if (answers[i] === p2[i % p2.length]) {
            s2++;
        }
        if (answers[i] === p3[i % p3.length]) {
            s3++;
        }
    }

    let scores = [s1, s2, s3];
    let maxScore = Math.max(...scores);

    let result = [];
    for (let i = 0; i < scores.length; i++) {
        if (scores[i] === maxScore) {
            result.push(i + 1); // 순번은 1부터 시작하므로 i+1을 push
        }
    }

    return result;
}

 

 

728x90
반응형
LIST