241022 TIL - 궂은 날의 TIL

LIHA·2024년 10월 22일
1

내일배움캠프

목록 보기
91/117
post-thumbnail

알고리즘

이젠 AI에게도 뼈를 맞는다 - 모의고사 완전탐색 AI 피드백

우선 오답코드는 다음과 같다.

// answers랑 비교해서 몇개나 맞췄는지 알고싶은 것. 동점인 인원이 있다면 return 값은 오름차순
const randomPickNumber = (answers) => {
    const supo1 = [1,2,3,4,5]
    const supo2 = [2,1,2,3,2,4,2,5]
    const supo3 = [3,3,1,1,2,2,4,4,5,5]
    
    let supo1ans = 0;
    let supo2ans = 0;
    let supo3ans = 0;
    answers.forEach((answer, i) => {
        if (answer === supo1[i % supo1.length])
            supo1ans++;
        if (answer === supo2[i % supo2.length])
            supo2ans++;
        if (answer === supo3[i % supo3.length])
            supo3ans++;
    });

    const mostPickedPeople = [];
    
    if(supo1ans > supo2ans && supo1ans > supo3ans) { 
        mostPickedPeople.push(1)
    } else if (supo1ans > supo2ans && supo1ans === supo3ans) {
        mostPickedPeople.push(1, 3)
    } else if (supo1ans === supo2ans && supo1ans !== supo3ans) {
        mostPickedPeople.push(1, 2)
    } else {
        mostPickedPeople.push(1, 2, 3)
    }
    
    if(mostPickedPeople.length !== 1) 
        mostPickedPeople.sort((a,b) => a-b)
    
    return mostPickedPeople;    
}

function solution(answers) {
    var answer = [];
    answer = randomPickNumber(answers);
    return answer;
}

테스트는 통과했으나 TC는 반타작이었고, AI 피드백을 이용하니 이런 답변을 주었다.

아, 네... (시무룩)

요주는 모든 경우의 수를 복잡하게 비교하기 보다는, 가장 높은 점수를 찾고 그 점수와 같은 값을 가진 모든 수포자들을 결과 배열에 넣는 방식 을 쓰라는 것. 나도 조금 더 코드를 줄일 수 있지 않을까? 라는 생각을 해 보았는데 마땅히 떠오르는 것은 없었다.

나와 비슷하게 헤매던 분의 정답 - 따라해본 나의 종착지

일단 고쳐본 나의 코드는 아래와 같다.

// answers랑 비교해서 몇개나 맞췄는지 알고싶은 것. 동점인 인원이 있다면 return 값은 오름차순
const randomPickNumber = (answers) => {
    const supo1 = [1,2,3,4,5]
    const supo2 = [2,1,2,3,2,4,2,5]
    const supo3 = [3,3,1,1,2,2,4,4,5,5]
    
    // 모든 경우의 수를 복잡하게 비교하기 보다는, 가장 높은 점수를 찾고 그 점수와 같은 값을 가진 모든 수포자들을 결과 배열에 넣는 방식
    
    const studentAnswer = new Array(3).fill(0);
    answers.forEach((answer, i) => {
        if (answer === supo1[i % supo1.length])
            studentAnswer[0]++;
        if (answer === supo2[i % supo2.length])
            studentAnswer[1]++;
        if (answer === supo3[i % supo3.length])
            studentAnswer[2]++;
    });

    const mostPickedPeople = []
    studentAnswer.forEach((v, i) => {
        v === Math.max(...studentAnswer) ? mostPickedPeople.push(i+1) : null;
    });
    mostPickedPeople.sort((a,b) => a-b);
    console.log('mostPickedPeople?:', mostPickedPeople)
    
    return mostPickedPeople;    
}

function solution(answers) {
    var answer = [];
    answer = randomPickNumber(answers);
    return answer;
}

이전 코드와 고쳐서 통과한 코드를 보고 나니 뭐가 문제였는지 조금 알 것 같다. 이전에 기주 튜터님께서 말씀해 주셨지만, 알고리즘 문제에는 반드시 '주인공이 되는' input이 있을 것이다. 이 문제에서의 주인공은 일단 answers 로 보이고, 다음으로 꼽자면 studentAnswer 배열 혹은 Math.max(...studentAnswer) 이지 않았을까 한다.

이전 코드에서 보이는 문제점은 다음과 같다.

  • 삼항연산자를 너무 중첩해서 쓰려고 하여 가독성이 떨어졌다.
  • 심지어 그 삼항연산자가 의도대로 작동했는지도 의문이다.
    (아마 아니니까 정답률이 반타작이지 않을까)

주특기 플러스

프로토스도 아니고 profobufjs는 뭔가요 - 내가 어제 찾아보았던 프로토콜 버퍼

241021 TIL에 보면, '바이너리 데이터 기반 직렬화' 라는 내용이 있다. 거기에 이용되는 형태 중 하나가 '프로토콜 버퍼' 였다.

우리가 게임개발 플러스에서 사용하고 있는 protobufjs 라는 것도 이 프로토콜 버퍼를 사용하기 위해서다. 프로토콜 버퍼는 원래 구글에 의해 만들어진 일종의 데이터 구조 이고, 원래 데이터를 뜯어다가 바이트배열로 만들었으니 '직렬화된 데이터 구조'이다.


기타

처음 알게된 사실 - Insomnia는 Git처럼 만든 HTTP Request들의 commit이 가능하다

예전에 풋살 때 동혁님이 이게 저장되지 않아서 다 날려먹었다고 말씀하셨던 게 기억났다. 그때는 '저장기능에 오류가 있나?' 라고만 생각했지, 설마 내가 컴퓨터를 바꾸면서 그걸 직접 겪게 될 줄이야.

좌하단에 master 라고 써있는, 상자와 구름모양이 있는 곳을 누르면 메뉴가 뜨고 그중 Commit이라는 메뉴가 있다. 그러고보니 인섬니아를 쓸때마다 Uncommitted changes 라고 써있는게 뭔질 몰랐는데, 컴퓨터를 새로 사면서 싹다 날려먹고 나니 깨닫게 되었다. 내가 쓰던 HTTP 명령어들은 모두 날아갔고 클라우드에는 아무것도 커밋된 게 없는 상태다. 어흐흑 따흐흑 흙흙 모래모래 자갈자갈.

profile
갑자기 왜 춤춰?

0개의 댓글